У меня есть пакетный файл, который я хотел бы запустить двойным щелчком по файлу в проводнике 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
)