Почему команда START, используемая в командном файле, не запускает командный файл? - PullRequest
0 голосов
/ 02 июня 2018

Я создал Main командный файл со строками ниже:

@echo off
color 1e
title  ------ Just a Test ------
start "C:\Users\%USERNAME%\Desktop\Check.bat"
:START
echo Welcome to the Game!
...

И Check.bat содержит:

@echo off
if not exist "C:\Users\%USERNAME%\Desktop\Batch_System\importantFile.dll" goto ERROR
if exist "C:\Users\%USERNAME%\Desktop\Batch_System\importantFile.dll" goto CONTINUE
:ERROR
cls
echo        ERROR :
echo   Important file not found. please reinstall the program 
pause
exit /b
:CONTINUE
cls
exit /b

Когда я использую команду start, онзапускает только командную строку с каталогом Check.bat, а основной пакетный файл продолжает запуск игры.Я хочу принудительно закрыть основной пакетный файл, если importantFile.dll не существует.

Хорошо, позвольте мне объяснить: когда основной пакетный файл выполняется и запускает команду start, чтобы запустить другой пакетный файл с именемCheck.bat, файл Check.bat проверяет, существует ли файл importantFile.dll, а если нет, Check.bat отображает сообщение об ошибке.

Кто-нибудь знает, как написать Check.bat так, чтобы приDLL-файл не существует, принудительно завершить работу основного пакетного файла?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Во-первых, справку по каждой команде можно получить, запустив в окне командной строки команду с /? в качестве параметра.start /? выводит команду START .call /? выводит справку команды CALL , обычно используемой для запуска командного файла из внутри командного файла.Эти две команды могут использоваться для запуска пакетного файла, как подробно описано в ответе на Как вызвать пакетный файл на один уровень выше текущего каталога?


Второйкомандная строка

start "C:\Users\%USERNAME%\Desktop\Check.bat"

запускает новый командный процесс на переднем плане с консольным окном с полным именем пакетного файла в качестве заголовка окна, отображаемого в строке заголовка в верхней части окна консоли.Это явно не нужно вам.


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

Как правило, лучше использовать "%USERPROFILE%\Desktop" вместо "C:\Users\%USERNAME%\Desktop".

. В Windows Vista до Windows Vista и Windows Server 2008 по умолчанию вообще нет C:\Users.

Каталог профиля пользователя может находиться на диске, отличном от диска C:.

Также возможно, что каталог текущего профиля пользователя находится не в C:\Users, например, на сервере Windows, на котороммногие пользователи могут войти в систему напрямую, и для этого администратор сервера решил разместить каталоги профилей пользователей на другом диске, чем на системном диске, что значительно упростило операции резервного копирования и очистки на сервере, а также улучшило безопасность.

Что ж,также возможно, чтобы папка рабочего стола пользователя не находилась в каталоге профиля пользователя.Но это действительно, очень редко.


В-четвертых, при отправке набора пакетных файлов рекомендуется использовать %~dp0 для вызова других пакетных файлов из пакетного файла из-за ссылки на эту строкудиск и путь аргумента 0 расширяется до полного пути исполняемого в данный момент пакетного файла.

Путь к пакетному файлу, на который указывает %~dp0, всегда заканчивается обратной косой чертой.Поэтому объедините %~dp0 всегда без дополнительной обратной косой черты с другим именем пакетного файла, папки или имени файла.

См. Также В чем причина изменения пути к пакетному файлу, на который ссылается% ~ dp0, иногда меняется при смене каталога?


В-пятых, я предлагаю следующие два ваших пакетных файла:

Main.bat:

@echo off
color 1e
title  ------ Just a Test ------
call "%~dp0Check.bat" || color && exit /B
echo Welcome to the Game!

Check.bat:

@echo off
cls
if exist "%~dp0Batch_System\importantFile.dll" exit /B 0
echo   ERROR:
echo   Important file not found. Please reinstall the program.
echo/
pause
exit /B 1

Пакетный файл Check.bat явно выходит из существующего файла, возвращая код завершения 0 в родительский пакетный файл Main.bat.По этой причине командный процессор Windows продолжает выполнение Main.bat в командной строке ниже командной строки , вызывая командный файл Check.bat.

В противном случае Check.bat выводит сообщение об ошибке, ожидаетдля нажатой клавиши пользователем и выходит явно с ненулевым кодом выхода 1.Ненулевой код завершения приводит к Main.bat выполнению следующей команды после ||, которая равна COLOR для восстановления начальных цветов, и к следующему выполнению также EXIT с параметром /B для выходавыполнение Main.bat.

См. также:

Командная строка CALL в Main.bat можно также записать как:

call "%~dp0Check.bat" || ( color & exit /B )

И Main.bat можно также записать как:

@echo off
color 1e
title  ------ Just a Test ------
call "%~dp0Check.bat"
if errorlevel 1 (
    color
    goto :EOF
)
echo Welcome to the Game!

Я не рекомендую использовать в Main.bat просто EXIT вместо exit /B или goto :EOF.Просто EXIT приведет к выходу из текущего командного процесса независимо от иерархии вызовов и независимо от того, как был запущен командный процесс: с параметром /K, чтобы он продолжал работать, чтобы видеть сообщения об ошибках, такие как при открытии окна командной строки.и затем запустите пакетный файл из окна командной строки или с помощью /C, чтобы закрыть командный процесс после завершения выполнения приложения / команды / скрипта, как при двойном щелчке по пакетному файлу.

Рекомендуется проверитьПакетные файлы, запустив их из открытого окна командной строки вместо двойного щелчка по ним, чтобы увидеть сообщения об ошибках синтаксических ошибок, выводимые cmd.exe.По этой причине использование только EXIT неэффективно для командного файла в разработке.Запустите cmd /? в окне командной строки для получения справки о самом командном процессоре Windows.

Последнее, но не менее важное:

0 голосов
/ 02 июня 2018

start является асинхронным по умолчанию.Используйте start /wait, чтобы main.bat мог проверить код выхода check.bat.Заставьте check.bat вернуть соответствующий код выхода.

Например ...

main.bat

@echo off
start /b /wait check.bat
if not %errorlevel% == 0 exit /b
echo "Welcome to the game!"
...

check.bat

@echo off
if exist "importantfile.dll" exit 0
echo ERROR: Important file not found. Please reinstall the program.
pause
exit 1

примечания

Добавлено /b до start, чтобы не открывать другое окно.Измените это в соответствии со своими предпочтениями.

Вы можете использовать call вместо start, но call предоставляет вызываемому коду доступ к переменным main.bat, так что инкапсуляция улучшается, если вы используете start какВы сделали.

Логика в check.bat упрощена выше.Как только вы определите путь успеха в начале сценария и завершите работу, остальная часть сценария может принять путь отказа.Это экономит вам несколько if и ярлыков, которые вы можете найти, упрощает написание и чтение подобных скриптов.Остерегайтесь возможной путаницы нескольких точек выхода в более длинных сценариях!

При выборе кодов выхода общепринятым условием успеха является 0.

Приведенный выше код является всего лишь одним методом - есть несколько других вариантов(например, checksomething && dosomethingifok).Некоторую полезную информацию о кодах возврата и проверке их можно найти в http://steve -jansen.github.io / guides / windows-batch-scripting / part-3-return-codes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...