我在将变量中的字符串与批处理中的实际字符串进行比较时遇到了很多麻烦。这是脚本:
set failure=0
for /F "usebackq delims=" %%L in (`"wmic PRINTER where name='10.146.2.52 - HP Color LaserJet CP5225n' GET Name 2>&1"`) do (
::Quotes around variable seem to have no effect. Same result w/ or w/o them.
if /I "%%L"=="No Instance(s) Available." set failure=1
echo %failure% %%L
)
这是输出:
为什么if语句失败?价值观明显匹配。请帮忙!!
答案 0 :(得分:2)
这里有三种不同的陷阱。
1)Wmic有时会在一行的末尾添加一个额外的CR
字符,这将是字符串的一部分。
2)您无法访问块内扩展百分比failure
3)%%L
试试这个
setlocal EnableDelayedExpansion
set failure=0
for /F "usebackq delims=" %%L in (`"wmic PRINTER where name='10.146.2.52 - HP Color LaserJet CP5225n' GET Name 2>&1"`) do (
set "line=%%L"
set "head=!line:~0,9!"
if "!head!"=="No Instan" set failure=1
echo 123-%%L-456
)
echo %failure%
答案 1 :(得分:1)
字符串通常在它之前/之后有更多的文本 - 即使有一个cr需要处理 - 而Wmic是一个奇怪的野兽要处理。
您可以执行单独测试并通过find
或findstr
管道结果以设置错误级别。类似于以下内容 - 或者在找到文本时使用find
设置为0的错误级别。
wmic PRINTER where name='10.146.2.52 - HP Color LaserJet CP5225n' GET Name 2>&1 |find "No Instance" >nul && echo printer not detected
在回显时将%% L括在引号中以查看是否存在明显的尾随文本。
这是我在调试中获得的,使用额外的CR / 0D以及它为您提供了一些空值以获得良好的衡量标准。 :)
0B48:0100 4E 6F 20 49 6E 73 74 61-6E 63 65 28 73 29 20 41 No Instance(s) A
0B48:0110 76 61 69 6C 61 62 6C 65-2E 0D 0D 0A 0D 00 0A 00 vailable........
答案 2 :(得分:0)
我认为问题是字符串No Instance(s) Available.
中的括号。
最简单的解决方案可能只是将字符串的第一部分子串出来,从而忽略括号。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET failure=0
FOR /F "usebackq delims=" %%L in (`"wmic PRINTER where name='10.146.2.52 - HP Color LaserJet CP5225n' GET Name 2>&1"`) DO (
SET str=%%L
SET substr=!str:~0,11!
IF /I "!substr!"=="No Instance" SET failure=1
ECHO !failure! !substr!
)