2013-10-09 157 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! 
)