В пакетном файле DOS у нас может быть только 1 строка тела оператора if? Я думаю, что нашел где-то, что можно было бы использовать ()
для блока if точно так же, как {}
в C-подобных языках программирования, но он не выполняет инструкции, когда я пытаюсь это сделать. Сообщения об ошибке тоже нет. Это мой код:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
Как ни странно, ни «GP Manager is up», ни «GP Manager is down» не печатаются, когда я запускаю командный файл.
if-statement
batch-file
Хью Дарлинг
источник
источник
Ответы:
Вы действительно можете создать блок операторов для выполнения после условного. Но у вас неправильный синтаксис. Скобки необходимо использовать точно так, как показано:
Однако я не верю, что существует какой-либо встроенный синтаксис для
else-if
операторов. К сожалению, для этого вам потребуется создать вложенные блокиif
операторов.Во-вторых, этот
%GPMANAGER_FOUND% == true
тест мне кажется очень подозрительным. Я не знаю, что установлено для переменной среды и как вы ее устанавливаете, но я очень сомневаюсь, что показанный вами код даст желаемый результат.Следующий пример кода мне подходит:
Обратите внимание на некоторые подробности моего примера кода:
@echo off
видеть все операторы, выводимые на консоль по мере их выполнения, а вместо этого просто вижу вывод тех, которые конкретно начинаются сecho
.ERRORLEVEL
переменную просто как тест. Подробнее здесьисточник
ERRORLEVEL
не является ответом на его проблему. Я просто размещал пример правильного синтаксиса. В этом случае допустимаif 0 == 0
любая форма, как и любое другое тривиальное выражение. Но на самом деле убедитесь, что вы понимаете разницу между переменной среды%ERRORLEVEL%
и внутреннейERRORLEVEL
частью командного процессора. Раймонд Чен прекрасно объясняет это здесь, в этом блоге .REM This is a comment (or so I thought)
вIF
блок вас испортит.IF %somevar%==example_string2
это всегда должен быть код, поэтому операнд должен принимать значениеIF "value_of_somevar"=="example_string2
«во избежание использования специальных символов в любом строковом операнде, вызывающих синтаксические ошибки вIF
инструкции. Значения, которые вы устанавливаете, всегда должны выполняться, посколькуset "somevar=value_of_somevar"
этот синтаксис позволяет вам избегать специальных символов в значениях переменных, Примечание что я не имел в видуset somevar="value_of_somevar"
По логике, ответ Коди должен сработать. Однако я не думаю, что командная строка логически обрабатывает блок кода. Да хоть убей, я не могу заставить это работать должным образом ни с одной командой в блоке. В моем случае обширное тестирование показало, что все команды в блоке кэшируются и выполняются одновременно в конце блока. Это, конечно, не дает ожидаемых результатов. Вот упрощенный пример:
Это должно предоставить var3 следующее значение:
но вместо этого дает:
потому что все 3 команды кэшируются и выполняются одновременно при выходе из блока кода.
Я смог преодолеть эту проблему, переписав блок if для выполнения только одной команды - goto - и добавив несколько меток. Это неуклюже, и мне это не очень нравится, но, по крайней мере, это работает.
источник
set var3=!var1!_!var2!
Вместо этого беспорядка goto попробуйте использовать амперсанд & или двойной амперсанд && (условно для уровня ошибки 0) в качестве разделителей команд.
Я исправил фрагмент сценария с помощью этого трюка, чтобы подвести итог, у меня есть три командных файла, один из которых вызывает два других после того, как обнаружил, какие буквы были назначены внешним дискам резервного копирования. Я оставляю первый файл на основном внешнем диске, поэтому вызовы его процедуры резервного копирования работали нормально, но вызовы второго требовали активной смены диска. В приведенном ниже коде показано, как я это исправил:
источник
Я наткнулся на эту статью в результатах поиска, связанных с командой IF в пакетном файле, и не мог устоять перед возможностью исправить неправильное представление о том, что блоки IF ограничены отдельными командами. Ниже приводится часть рабочего командного сценария Windows NT, который ежедневно выполняется на машине, на которой я составляю этот ответ.
Возможно, блоки из двух или более строк применяются исключительно к командным сценариям Windows NT (файлам .CMD), поскольку поиск в каталоге производственных сценариев приложения, которое ограничено пакетными файлами старой школы (.BAT), выявил только блоки с одной командой . Поскольку приложение находится на расширенном обслуживании (это означает, что я не принимаю активного участия в его поддержке), я не могу сказать, произошло ли это потому, что мне не требовалось более одной строки, или я не мог заставить их работать.
В любом случае, если последнее верно, есть простой обходной путь; переместите несколько строк в отдельный пакетный файл или подпрограмму пакетного файла. Я знаю, что последний работает в обоих типах скриптов.
источник
Может, немного поздно, но надеюсь, что черт возьми:
источник