batch-file
  • if-statement
  • cmd
  • 2013-10-09 5 views 2 likes 
    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

    Почему если оператор не в состоянии? Значения явно совпадают. Пожалуйста помоги!!

    ответ

    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

    Строка часто имеет больше текста перед/после - даже если есть сг там иметь дело с - и 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........ 
    
    +0

    +1 Правда, в моем случае (немецкая версия) у меня есть хвостовой' CR' – jeb

    +0

    @jeb Мне тоже, см. Мой пост выше для вывода отладки - Windows 8 Pro 32-битный английский. – foxidrive

    +0

    Можете ли вы дать образец findstr? Как найти str на 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! 
    ) 
    
    Смежные вопросы