微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wmic DiskDrive where (MediaType!='Removable media') 在设置 SetLocal EnableDelayedExtensions 时获取模型返回意外值

如何解决wmic DiskDrive where (MediaType!='Removable media') 在设置 SetLocal EnableDelayedExtensions 时获取模型返回意外值

例如这段代码

wmic diskDrive where (MediaType!='Removable media') get model

返回系统中除可移动设备外的所有存储设备

但是这个代码

SetLocal EnableelaysedExtensions
wmic diskDrive where (MediaType!='Removable media') get model

恰恰相反 - 系统中只有可移动设备。

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

解决方法

命令行 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

命令 FOR 在这种情况下在后台运行,Windows 安装到 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 的输出是 Unicode 编码的 UTF-16 Little Endian (LE) 和字节顺序标记 (BOM),由 FOR 处理。

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

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

where 也必须仅使用一个 ) 进行转义,以被解释为文字字符而不是命令 FOR 的集合的结尾。 ^ 子句的两个圆括号并不是真正必要的。所以也可以使用:

where

阅读有关 Using command redirection operators 的 Microsoft 文档以了解 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 必须在 FOR 命令行上用脱字符符 > 转义,以便在 Windows 命令解释器在执行命令 之前处理此命令行时被解释为文字字符FOR 在后台启动的单独命令进程中执行嵌入的 ^ 命令行。

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

请进一步注意,由于使用了 FOR /F 选项 I,在字符串中带有等号的磁盘驱动器型号字符串也将无法正确处理。但我从未见过型号名称中带有 tokens=2 delims== 的磁盘驱动器。所以这应该不是问题。

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

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

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

,

您的命令的正确语法应该是:

Navigator.push(
    context,MaterialPageRoute(
      builder: (context) => NewScreen(data: 'Test'),),);

但是,当启用延迟扩展时,%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Where "MediaType != 'Removable media'" Get Model 字符具有特殊含义,在这种情况下被忽略。

最简单的解决方法是使用 ! 运算符的替代方法。如果您查看可用的 WQL operators,您应该注意到您可以改为使用 !=:

<>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。