Как узнать, был ли запущен пакетный файл из командного окна?

Как узнать, был ли запущен пакетный файл из командного окна?

У меня есть пакетный файл, который я хотел бы запустить двойным щелчком по файлу в проводнике Windows. Когда это будет сделано, я хочу закончить с ПАУЗОЙ, чтобы окно не закрывалось немедленно.

Но если пакетный файл запускается из командной оболочки, я бы предпочел не заканчивать его ПАУЗОЙ.

Есть ли способ определить в пакетном файле, запущен ли он в командной строке, созданной из проводника Windows, или в существующей командной оболочке?

Bash предоставляет специальную переменную окружения $-.

Есть ли что-то подобное в cmd.exe?

решение1

Не точное решение, но вы можете создать ярлык для вашего cmd-файла и добавить параметр командной строки к цели. Когда вам нужно запустить cmd из Проводника, вам придется запустить ее ярлык, а не файл cmd. В вашем cmd-файле вы проверите параметр %1, чтобы определить, был ли он запущен с ярлыка (из Проводника) или из командной строки.

решение2

Я попробовал предложение Джина на Windows 10:

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC% " Pause

Но у меня это не сработало. ОДНАКО, когда я удалил пробел в конце %COMSPEC%, это сработало:

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC%" Pause

У меня нет репутации просто прокомментировать оригинальный пост, но я бы предпочел, чтобы кто-нибудь добавил это к ответу Джина и проголосовал за него (поскольку он дал мне основу для решения моей проблемы).

решение3

Я разместил решение похожего вопроса здесь:886848/как-сделать-пакетный-файл-windows-паузу-при-двойном-щелчке.

Это решение должно вам подойти, но оно немного сложнее, чем вам, вероятно, нужно.

Ниже я разместил сокращенную версию, которая проще и должна вам подойти.

Подробнее об этом можно прочитать в решении, ссылка на которое приведена выше, но суть его в том, что он использует переменную среды: %cmdcmdline%для определения, был ли запущен пакетный файл из командного окна или нет.

Это работает, потому что содержимое переменной %cmdcmdline%различается в зависимости от того, как был запущен пакетный файл: 1) путем щелчка по пакетному файлу или ярлыку, например, в проводнике Windows или на рабочем столе, или 2) путем запуска пакетного файла из окна командной строки.

Итак, используйте его следующим образом:

В момент завершения работы пакетного файла добавьте такой код:

set newcmdcmdline=%cmdcmdline:"=-%
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-"
set "result=%errorlevel%"

rem if %result% EQU 0 
rem     this batch file was executed by clicking a batch file 
rem     or a shortcut to a batch file, typically from Windows Explorer 
rem     or the Desktop, or the "Start Menu" ...

rem if %result% NEQ 0 
rem     this batch file was executed from within a Command Prompt

rem if executed from within a Command Prompt: 
rem     go exit the batch script immediately, without pausing. 
rem     since this batch file was executed from within a 
rem     Command Prompt, the command window will remain open. 
rem     You can use either of these to exit the batch file:
rem          goto :EOF
rem          exit /b

if %result% NEQ 0 goto :EOF

rem at this point, we know this batch file was executed by clicking ..., 
rem     NOT from within a Command Prompt. 

rem leave the command prompt window open to allow the user time to 
rem    view the messages on the screen before exiting. Use any of 
rem    these to pause and or interact with the user before exiting: 
rem        pause
rem        echo Message... &pause
rem        set /p "d=Message..."
rem        choice [Options...]
rem            (choice /? Displays help message for the Choice command)
rem        timeout /T wait-time [Options...]
rem            (timeout /? Displays help message for the Timeout command)

timeout /t 10
goto :EOF

решение4

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

Мне помогает вот это:

if "%CMDCMDLINE:"=%" == "%COMSPEC%" (
  REM started via windows explorer
) else if "%CMDCMDLINE%" == "cmd.exe" (
  REM started via file manager (e.g. FreeCommander)
) else if "%CMDCMDLINE:"=%" == "%COMSPEC% /c %~dpf0 " (
  REM started in command window
) else (
  REM started from other batch file
)

Связанный контент