批量匹配磁盘串口字符串失败

Failing to match string with disk serial in batch

我对批处理的经验很少,现在我很难比较字符串。

本质上,我真正想要的是检查我是否安装了外部驱动器以及是否触发命令。我获取了所有驱动器序列号,并检查列表中是否有我期望的驱动器:

:: I've tested with and without the EnableDelayedExpansion:
::setlocal EnableDelayedExpansion  
::setlocal EnableExtensions EnableDelayedExpansion

set torun=wmic diskdrive get serialnumber /format:value
for /f "tokens=2 delims==" %%a in ('%torun%') do (
    ::set "serial=%%a"
    echo %%a
    set "expected=     ABCDEFG1"
    if "!expected!" == "%%a" echo Valid serial number!
)

当我 运行 这样做时,我实际上看到打印的驱动程序序列号,我想要的那个在列表中,但是 if 语句从未触发,我实际上尝试了几种不同的方法。 我试过:

if %%a == "     ABCDEFG1" echo Valid serial number!
if "%%a" == "     ABCDEFG1" echo Valid serial number!
if /I "!expected!" == "%%a" echo Valid serial number!
if !expected!" == "%%a" echo Valid serial number!
if %expected% == "%%a" echo Valid serial number!
if "%expected%" == "%%a" echo Valid serial number!

和其他几个变体,有时脚本 运行 但不会触发 echo Valid serial number!,有时 I get echo was unexpected at this time.

值得注意的是,在 echo %%a 中,一些驱动程序在序列号之前带有多个尾随空格,我已经尝试检查是否有空格

PS.: 我的脚本中有正确的连续剧。

我会做不同的事情:

来自

%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Where "SerialNumber Like ' %ABCDEFG1'" Assoc /ResultClass:Win32_PnPEntity 2>NUL | %SystemRoot%\System32\findstr.exe "^_" 1>NUL && (Echo Valid serial number) || Echo Invalid serial number

来自 :

@%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Where "SerialNumber Like ' %%ABCDEFG1'" Assoc /ResultClass:Win32_PnPEntity 2>NUL | %SystemRoot%\System32\findstr.exe "^_" 1>NUL && (Echo Valid serial number) || Echo Invalid serial number

或者,如果您想按照自己的方式进行,通过 for 循环,不要使用标准列表格式,使用托管对象格式,这将省略任何错误的前导 space 个字符,让你的比较更简单:

@For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Get SerialNumber /Format:MOF 2^>NUL') Do @Set "DriveSerial=%%G"
@If /I "%DriveSerial%" == "ABCDEFG1" Echo Valid serial number 

出于礼貌,这里有一个更符合您提交的方法的示例:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "ExpectedSerial=ABCDEFG1"
Set "ToRun=%SystemRoot%\System32\wbem\WMIC.exe DiskDrive Get SerialNumber"
For /F Tokens^=6^ Delims^=^" %%G In ('%ToRun% /Format:MOF 2^>NUL') Do (
    Echo %%G
    If /I "%ExpectedSerial%" == "%%G" Echo Valid serial number!
    Rem Set "DriveSerial=%%G"
    Rem SetLocal EnableDelayedExpansion
    Rem If /I "%ExpectedSerial%" == "!DriveSerial!" Echo Valid serial number^^!
    Rem EndLocal
)
Pause

您会注意到我已经正确地使用 Rem 来评论我的代码。您不应该使用损坏的标签 (::) 作为注释,尤其是当它经常在带括号的代码块中失败时。请根据需要对行进行注释和取消注释。