Могу ли я иметь блок IF в пакетном файле DOS?
в пакетном файле DOS мы можем иметь только 1 строку, если тело оператора? Я думаю, что я нашел где-то, что я мог бы использовать ()
для блока 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 " не печатается при запуске пакетного файла.
5 ответов:
вы действительно можете разместить создать блок операторов для выполнения после условного. Но у вас неверный синтаксис. Круглые скобки должны использоваться точно так, как показано ниже:
if <statement> ( do something ) else ( do something else )
однако я не верю, что есть какой-либо встроенный синтаксис для
else-if
заявления. К сожалению, вам нужно будет создать вложенные блокиif
заявления, чтобы справиться с этим.
Во-вторых, что%GPMANAGER_FOUND% == true
тест выглядит очень подозрительно для меня. Я не знаю, что такое окружающая среда переменная имеет значение или как вы ее устанавливаете, но я очень сомневаюсь, что код, который вы показали, даст результат, который вы ищете.
Следующий код отлично работает для меня:@echo off if ERRORLEVEL == 0 ( echo GP Manager is up goto Continue7 ) echo GP Manager is down :Continue7
обратите внимание на несколько конкретных деталей о моем примере кода:
- пробел, добавленный между концом условного оператора и открывающей скобкой.
- я
@echo off
чтобы не видеть все of операторы печатаются на консоль по мере их выполнения, а вместо этого просто видят вывод тех, которые специально начинаются сecho
.- я использую встроенный
ERRORLEVEL
переменная просто как тест. Читать дальше здесь
логически, ответ Коди должны работа. Однако я не думаю, что командная строка обрабатывает блок кода логически. За всю мою жизнь я не могу заставить это работать должным образом с любой командой внутри блока. В моем случае обширное тестирование показало, что все команды в блоке кэшируются и выполняются одновременно в конце блока. Это, конечно, не дает ожидаемых результатов. Вот это упрощение пример:
if %ERRORLEVEL%==0 ( set var1=blue set var2=cheese set var3=%var1%_%var2% )
этой должны укажите var3 со следующим значением:
blue_cheese
но вместо этого дает:
_
потому что все 3 команды кэшируются и выполняться одновременно при выходе из блока кода.
я смог преодолеть эту проблему, переписав блок if, чтобы выполнить только одну команду-goto-и добавив несколько меток. Он неуклюжий, и мне это не очень нравится, но, по крайней мере, он работает.
if %ERRORLEVEL%==0 goto :error0 goto :endif :error0 set var1=blue set var2=cheese set var3=%var1%_%var2% :endif
может быть, немного поздно, но надеюсь, что это hellps:
@echo off if %ERRORLEVEL% == 0 ( msg * 1st line WORKS FINE rem You can relpace msg * with any othe operation... goto Continue1 ) :Continue1 If exist "C:\Python31" ( msg * 2nd line WORKS FINE rem You can relpace msg * with any othe operation... goto Continue2 ) :Continue2 If exist "C:\Python31\Lib\site-packages\PyQt4" ( msg * 3th line WORKS FINE rem You can relpace msg * with any othe operation... goto Continue3 ) :Continue3 msg * 4th line WORKS FINE rem You can relpace msg * with any othe operation... goto Continue4 ) :Continue4 msg * "Tutto a posto" rem You can relpace msg * with any othe operation... pause
вместо этого goto беспорядок, попробуйте использовать амперсанд & или двойной амперсанд & & (условно errorlevel 0) в качестве разделителей команд.
я исправил фрагмент сценария с этим трюком, чтобы подвести итог, у меня есть три пакетных файла, один из которых вызывает два других после того, как нашел, какие буквы были назначены внешние резервные диски. Я оставляю первый файл на основном внешнем диске, поэтому вызовы его процедуры резервного копирования работали нормально, но вызовы второго требовали активная смена привода. Код ниже показывает, как я это исправил:
для %%b in (d e f g h i j k l m n o p q r s t u v w x y z) DO ( если существует "%%b:\Backup.cmd "%%b: & CALL " %%b:\Backup.УМК" )
я наткнулся на эту статью в результатах поиска, связанных с командой IF в пакетном файле, и я не мог устоять перед возможностью исправить неправильное представление о том, что блоки IF ограничены отдельными командами. Ниже приведена часть производственного командного сценария Windows NT, который ежедневно запускается на машине, на которой я составляю этот ответ.
if "%COPYTOOL%" equ "R" ( WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using RoboCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*" %TOOLPATH% %SRCEPATH% %DESTPATH% /copyall %RCLOGSTR% /m /np /r:0 /tee C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Robocopy] %TEMP%\%~n0.TMP %ERRORLEVEL% ) else ( WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using XCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*" call %TOOLPATH% "%USERPROFILE%\My Documents\Outlook Files\*" "%USERPROFILE%\My Documents\Outlook Files\_backups" /f /m /v /y C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Xcopy] %TEMP%\%~n0.TMP %ERRORLEVEL% )
возможно, блоки из двух или более строк применяются исключительно к командным скриптам Windows NT (.Файлы CMD), потому что a поиск в каталоге производственных сценариев приложения, которое ограничено старой школьной партией (.Бат-файлы), выявил только один-командные блоки. Поскольку приложение перешло в расширенное обслуживание (что означает, что я не активно участвую в его поддержке), я не могу сказать, потому ли это, что мне не нужно было больше одной строки, или что я не мог заставить их работать.
независимо от того, если последнее верно, существует простой обходной путь; переместите несколько строк в отдельный пакетный файл или батник подпрограммы. Я знаю, что последний работает в обоих видах сценариев.