例如,下面的代码
wmic DiskDrive where (MediaType!='Removable media') get model退还系统中除可拆卸设备以外的所有存储设备
但是这段代码
SetLocal EnableelaysedExtensions
wmic DiskDrive where (MediaType!='Removable media') get model返回完全相反的结果--只有系统中的可移动设备。
有什么办法可以解决这个问题吗?我需要脚本中的SetLocal指令用于其他目的,所以我不能删除它。
发布于 2021-04-05 19:50:17
命令行SetLocal EnableelaysedExtensions会导致以下错误消息:
SETLOCAL命令的参数无效
命令SETLOCAL支持四个不同的参数,因为它可以通过在打开的command prompt窗口中运行setlocal /?来读取:
我想想要的代码是这样的:
@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的情况下在后台运行
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子句的两个圆括号实际上并不是必需的。因此也可以使用:
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?
发布于 2021-04-05 20:10:34
命令的正确语法应为:
%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Where "MediaType != 'Removable media'" Get Model但是,当启用延迟扩展时,!字符具有特殊含义,在这种情况下会被忽略。
最简单的解决方法是使用!=操作符的替代方法。如果您查看一下可用的WQL operators,您应该注意到您可以改为使用<>
%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Where "MediaType <> 'Removable media'" Get Modelhttps://stackoverflow.com/questions/66950379
复制相似问题