批量匹配磁盘串口字符串失败
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
来自 batch-file:
@%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
来评论我的代码。您不应该使用损坏的标签 (::
) 作为注释,尤其是当它经常在带括号的代码块中失败时。请根据需要对行进行注释和取消注释。
我对批处理的经验很少,现在我很难比较字符串。
本质上,我真正想要的是检查我是否安装了外部驱动器以及是否触发命令。我获取了所有驱动器序列号,并检查列表中是否有我期望的驱动器:
:: 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
来自 batch-file:
@%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
来评论我的代码。您不应该使用损坏的标签 (::
) 作为注释,尤其是当它经常在带括号的代码块中失败时。请根据需要对行进行注释和取消注释。