Подтвердить что ты не робот

Условная ПАУЗА (не в командной строке)

Мне нравится иметь окончательный 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
4b9b3361

Ответ 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 остановится. Если вы вызвали из командной строки, это не будет.