Условная ПАУЗА (не в командной строке)
Мне нравится иметь окончательный PAUSE
в моих *.bat-сценариях, поэтому я могу просто дважды щелкнуть по ним в проводнике Windows и получить возможность прочитать результат. Однако окончательная ПАУЗА является досадой, когда я запускаю тот же script из командной строки.
Есть ли способ определить, запускаем ли мы script из командной строки (или нет) и соответственно вставляем PAUSE (или нет)?
(Целевая среда - Windows XP и выше.)
Update
Мне удалось составить это из ответа Андерса:
(((echo.%cmdcmdline%)|find /I "%~0")>nul)
if %errorlevel% equ 0 (
set GUI=1
) else (
set CLI=1
)
Затем я могу сделать следующее:
if defined GUI pause
Ответы
Ответ 1
@echo off
echo.Hello World
(((echo.%cmdcmdline%)|find /I "%~0")>nul)&&pause
... Только NT +,%% cmdcmdline% в Win9x возможно.
Как указано E M в комментариях, все это на одной строке открывает вам некоторые случаи краев, где% cmdcmdline% выйдет из скобки. Обходной путь состоит в использовании двух строк:
@echo off
echo.Hello World
echo.%cmdcmdline% | find /I "%~0" >nul
if not errorlevel 1 pause
Ответ 2
Я сомневаюсь, что существует различие, потому что я думаю, что он просто запускает командную строку, а затем запускает биту, когда вы дважды щелкаете по ней.
Однако, если вы создаете ярлыки для файлов bat и переходите к Properties и добавляете дополнительный аргумент (что-то вроде "/p" ) в поле "Target", вы можете проверить наличие этого аргумента на конец script и сделать паузу, если она установлена. Тогда запуск из ярлыка приведет к тому, что он закончится в паузе, и запуск из командной строки не будет.
Ответ 3
Я надеялся, что ответ @Anders будет работать в собственном .bat файле. К сожалению, это не для меня. Основываясь на комментарии @DarinH, возможно, это для некоторых. script ниже должен работать для всех, но требует дополнительного параметра.
Ключ находится в переменной % CmdCmdLine%, которая, как я полагаю, может быть немного иной для нескольких краевых случаев.
PauseIfGui.bat
@echo off
if "%~1" == "" ((echo.%CmdCmdLine%)|"%WinDir%\System32\find.exe" /I "%~0")>nul && pause & exit /b
((echo.%CmdCmdLine%)|"%WinDir%\System32\find.exe" /I "%~1")>nul && pause
Это принимает один необязательный параметр: полный путь вызова script. Если никакие параметры не переданы, он работает так же, как @Anders script.
AnyOtherFile.bat
@echo off
call PauseIfGui.bat %~f0
Если открыт из проводника (т.е. дважды щелкнув), AnyOtherFile.bat остановится. Если вы вызвали из командной строки, это не будет.