2013-10-09 46 views
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 
) 

下面是输出:

enter image description here

为什么if语句失败?值显然匹配。请帮忙!!

回答

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% 
+0

该病症仍然是错误的。失败未设置为1,但应为bc'%% L'确实等于“无实例可用”。有没有办法处理这个'CR'字符? – ExceptionLimeCat

+0

我看到了问题,它似乎缺少引号,我编辑我的代码 – jeb

+0

我试过了。它没有效果。失败仍然是0. – ExceptionLimeCat

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........ 
+0

+1在我的情况(德语版本)中,我有一个尾随的'CR' – jeb

+0

@jeb Me,请参阅我的文章以获取调试输出 - Windows 8 Pro 32位英文。 – foxidrive

+0

你可以给一个findstr的样本吗?我如何在var上找到? – ExceptionLimeCat

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! 
)