2

我在将变量中的字符串与批量的实际字符串进行比较时遇到了很多麻烦。这是脚本:

 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 语句会失败?这些值显然匹配。请帮忙!!

4

3 回答 3

2

这里有三个不同的陷阱。

CR1) Wmic 有时会在行尾附加一个额外的字符,这将是字符串的一部分。
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%
于 2013-10-09T14:52:54.413 回答
1

字符串之前/之后通常有更多文本 - 即使那里有一个 cr 需要处理 - 而 Wmic 是一个奇怪的野兽来处理。

您可以进行单独的测试并将结果通过管道传输findfindstr设置错误级别。类似于以下内容 - 或在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........
于 2013-10-09T15:43:41.810 回答
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!
 )
于 2013-10-09T16:50:41.707 回答