首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wmic DiskDrive where (MediaType!='Removable media') get model在设置SetLocal EnableDelayedExtensions时返回意外的值

wmic DiskDrive where (MediaType!='Removable media') get model在设置SetLocal EnableDelayedExtensions时返回意外的值
EN

Stack Overflow用户
提问于 2021-04-05 16:47:51
回答 2查看 242关注 0票数 0

例如,下面的代码

代码语言:javascript
复制
wmic DiskDrive where (MediaType!='Removable media') get model

退还系统中除可拆卸设备以外的所有存储设备

但是这段代码

代码语言:javascript
复制
SetLocal EnableelaysedExtensions
wmic DiskDrive where (MediaType!='Removable media') get model

返回完全相反的结果--只有系统中的可移动设备。

有什么办法可以解决这个问题吗?我需要脚本中的SetLocal指令用于其他目的,所以我不能删除它。

EN

回答 2

Stack Overflow用户

发布于 2021-04-05 19:50:17

命令行SetLocal EnableelaysedExtensions会导致以下错误消息:

SETLOCAL命令的参数无效

命令SETLOCAL支持四个不同的参数,因为它可以通过在打开的command prompt窗口中运行setlocal /?来读取:

  • ENABLEEXTENSIONS / DISABLEEXTENSIONS
  • ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION

我想想要的代码是这样的:

代码语言:javascript
复制
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "ModelCount=0"
for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe DiskDrive where (MediaType^^!^="Removable media"^) GET Model /VALUE 2^>nul') do (
    set /A ModelCount+=1
    set "Model!ModelCount!=%%I"
)
set Model
pause
endlocal

在这种情况下,的命令在安装到C:\Windows的情况下在后台运行

代码语言:javascript
复制
C:\Windows\System32\cmd.exe /c C:\Windows\System32\wbem\wmic.exe DiskDrive where (MediaType!="Removable media") GET Model /VALUE 2>nul

对的WMIC编码的输出进行处理。

在这种情况下,感叹号!必须使用两个^进行转义,因为启用了delayed expansion,以便将其解释为文字字符,而不是延迟的扩展环境变量引用的开始。由于启用了延迟扩展,Windows命令处理程序会对命令行进行两次分析。由于这个原因,在第一次解析时,^^!变成了^!,在第二次解析时,插入字符现在被解释为解释标记的转义字符,并且由于这个原因,只将!传递给在后台启动的cmd.exe,分别在后台执行wmic.exe

where子句中的等号=还必须使用^进行转义,以解释为文字字符,否则处理批处理文件的cmd.exe会将其解释为参数分隔符,并将等号替换为正常的空格字符,这将使where子句无效。

)还必须仅使用一个^进行转义,以将其解释为文字字符,而不是的命令集的末尾。where子句的两个圆括号实际上并不是必需的。因此也可以使用:

代码语言:javascript
复制
for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe DiskDrive where MediaType^^!^="Removable media" GET Model /VALUE 2^>nul') do (

有关2>nul的说明,请阅读有关Using command redirection operators的微软文档。重定向操作符>必须使用上的插入字符^进行转义,以便在命令解释程序处理此命令行时将其解释为文字字符,然后执行的命令,该命令将在后台启动的单独命令进程中执行嵌入的wmic命令行。

请注意,分配给包含一个或多个感叹号的循环变量I的磁盘驱动器模型字符串将被错误地分配给环境变量,因为第二次解析命令行set "Model!ModelCount!=%%I"会导致将分配给循环变量I的字符串中的感叹号解释为延迟扩展环境变量引用的开始/结束。

请进一步注意,由于使用/F options tokens=2 delims==的,因此也无法正确处理字符串中带有等号的磁盘驱动器型号字符串。但我从未见过型号名称中有=的软盘驱动器。所以这永远不会是问题。

要了解使用的命令及其工作原理,请打开一个command prompt窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • pause /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic diskdrive /?
  • wmic diskdrive get /?

另请参阅:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

票数 0
EN

Stack Overflow用户

发布于 2021-04-05 20:10:34

命令的正确语法应为:

代码语言:javascript
复制
%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Where "MediaType != 'Removable media'" Get Model

但是,当启用延迟扩展时,!字符具有特殊含义,在这种情况下会被忽略。

最简单的解决方法是使用!=操作符的替代方法。如果您查看一下可用的WQL operators,您应该注意到您可以改为使用<>

代码语言:javascript
复制
%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Where "MediaType <> 'Removable media'" Get Model
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66950379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档