Условная пауза (не в командной строке) - PullRequest
15 голосов
/ 14 октября 2010

Мне нравится иметь окончательный PAUSE в моих * .bat скриптах, поэтому я могу просто дважды щелкнуть по ним в проводнике Windows и иметь возможность прочитать вывод. Однако последняя ПАУЗА раздражает, когда я запускаю тот же сценарий из командной строки.

Есть ли способ определить, запускаем ли мы сценарий из командной строки (или нет) и, соответственно, вставить PAUSE (или нет)?

(Целевая среда - Windows XP и выше.)

Обновление

Мне удалось составить это из ответа Андерса:

(((echo.%cmdcmdline%)|find /I "%~0")>nul)
if %errorlevel% equ 0 (
    set GUI=1
) else (
    set CLI=1
)

Тогда я могу сделать что-то вроде этого:

if defined GUI pause

Ответы [ 3 ]

19 голосов
/ 15 октября 2010
@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
3 голосов
/ 14 октября 2010

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

Однако, если вы сделаете ярлыки на файлы bat и перейдете кСвойства и добавьте дополнительный аргумент (что-то вроде "/ p") в поле "Target", тогда вы можете проверить наличие этого аргумента в конце скрипта и сделать паузу, если он установлен.Затем запуск из ярлыка приведет к паузе, а запуск из командной строки - нет.

0 голосов
/ 03 октября 2014

Я надеялся, что ответ @Anders будет работать в его собственном .bat-файле. К сожалению, это не для меня. Судя по комментарию @ DarinH, возможно, так оно и есть для некоторых. Сценарий ниже должен работать для всех, но требует дополнительного параметра.

Ключ лежит в переменной окружения % 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

Это принимает один необязательный параметр: полный путь вызова скрипта. Если параметры не переданы, он запускается так же, как сценарий @Anders.


AnyOtherFile.bat

@echo off
call PauseIfGui.bat %~f0

При открытии из Проводника (т. Е. Двойного щелчка) AnyOtherFile.bat приостанавливается. Если вызывается из командной строки, он не будет.

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