none
Командная строка и условие If RRS feed

  • Вопрос

  • Возможно, кто-нибудь знает ответ на мой вопрос, хотя подобные давно вышли из моды вместе со старыми Windows.

    Если попытаться ввести в командной строке следующий скрипт:
    ECHO RESULT: & IF 1==1 ECHO TRUE & ECHO END OF CODE
    то обработчик безусловно выдаст результат:
    RESULT:
    TRUE
    END OF CODE


    Но если код будет следующим:
    ECHO RESULT: & IF 1==2 ECHO TRUE & ECHO END OF CODE
    то результат будет неверным (нет текста «END OF CODE»):
    OF CODE
    RESULT:


    Можно провести еще несколько подобных экспериментов, но все они покажут, что при неверном условии после IF код завершается и дальше не продолжается вовсе.

    Если же записать тот же самый код в пакетном файле (test.bat, например):
    @ECHO OFF
    ECHO RESULT:
    IF 1==2 ECHO TRUE
    ECHO END OF CODE
    PAUSE
    то результат будет верным:
    RESULT:
    END OF CODE
    Для продолжения нажмите любую клавишу . . .


    Значит, проблема или с ошибкой обработки оператора IF в командной строке, или с символом условной обработки &, и я подозреваю, что дело во втором.

    Во всех трех справочниках (встроенном в cmd.exe, встроенном в Windows, на сайте microsoft.com) написано:

    Символ: & [...]
    Синтаксис: команда1 & команда2
    Определение: Используется для разделения нескольких команд в одной командной строке. В Cmd.exe выполняется первая команда, затем вторая команда.

    У меня возник следующий вопрос: как правильно написать приведенный в примере код для командной строки (не для пакетного файла), то есть, чтобы он работал до конца? И хотелось бы узнать, из-за чего возникает обнаруженная мной ошибка или проблема.

    Спасибо.
    17 октября 2007 г. 7:08

Все ответы

  • Да все логично. Левая часть не истинная, соответственно правая часть не выводится.

     

    @echo off
    ECHO RESULT:
    IF 1==2 (ECHO TRUE) else (ECHO FALSE & ECHO END OF CODE)

    17 октября 2007 г. 8:21
  •  Michael Gotch написано:

    Да все логично. Левая часть не истинная, соответственно правая часть не выводится.

    Не логично, потому что в правой части присутствует символ &, который, как я думал, должен работать как перевод на следующую строку.

     

    @echo off
    ECHO RESULT:
    IF 1==2 (ECHO TRUE) else (ECHO FALSE & ECHO END OF CODE)

    Во-первых, требуется все в одну строку. Во-вторых, требуется одно условие и не в ELSE (зачем там вообще текст о конце кода?). И, самое важное, требуется, чтобы этот код работал в любой версии Windows, начиная с 95 и заканчивая Vista, поэтому скобки отпадают.

    Меня интересует конкретно символ & и то, почему при неверном условии IF безо всякого ESLE код просто прерывается, не выполняется совсем?
    17 октября 2007 г. 13:41
  •  Stupid Winuser написано:

    Во-первых, требуется все в одну строку. Во-вторых, требуется одно условие и не в ELSE (зачем там вообще текст о конце кода?). И, самое важное, требуется, чтобы этот код работал в любой версии Windows, начиная с 95 и заканчивая Vista, поэтому скобки отпадают.

    Меня интересует конкретно символ & и то, почему при неверном условии IF безо всякого ESLE код просто прерывается, не выполняется совсем?

     

    ECHO RESULT: & IF 1==2 (ECHO TRUE & ECHO END OF CODE) else (ECHO FALSE & ECHO END OF CODE)

     

    В одну строку. Условие одно - IF 1==2. Результат такой как вы хотите.

     

    Почему прерывается выполнение? Очевидно потому, что если условие ложно, то команды справа не выполняются. Вне зависимости от их числа.

    17 октября 2007 г. 14:32
  • Образец кода
    ECHO RESULT: & ( IF 1==2 ECHO TRUE ) & ECHO END OF CODE

     

     

     

    И всё работает. Проблема возникет из-за того, что тут всего одна строка и в IF интерпретатор воспринимат _всё_ остальное как то что надо выполнить при "истине". Скобки ограничивают это. И вышеприведенный оператор будет работать так, как Вы хотите.

    17 октября 2007 г. 14:59
  •  КГБ написано:

    Образец кода
    ECHO RESULT: & ( IF 1==2 ECHO TRUE ) & ECHO END OF CODE

     
    И всё работает. Проблема возникет из-за того, что тут всего одна строка и в IF интерпретатор воспринимат _всё_ остальное как то что надо выполнить при "истине". Скобки ограничивают это. И вышеприведенный оператор будет работать так, как Вы хотите.

    Спасибо большое, больше нигде такой иформации про IF я не нашел.

    Но напомню, что код должен работать в командной строке Windows начиная с Windows 95, где скобок, как и ELSE, пока нет в помине. Как-нибудь можно решить эту проблему, или составить строку в примере кода так, чтобы она правиьно работала в Windows 95? То есть, сначала условие, и если оно истинно (или ложно, если перед ним стоит NOT), потом следующий блок команд, никак не зависящий от условия, то есть блока IF ....
    17 октября 2007 г. 15:49
  • Замечаю, что вопрос еще не закрыт. Как быть с Windows 95 и 98?
    19 октября 2007 г. 6:04
  •  Stupid Winuser написано:
    Замечаю, что вопрос еще не закрыт. Как быть с Windows 95 и 98?

    Если бы ещё найти cmd от Win 95/98. Раритетс ...

     

    24 октября 2007 г. 8:22