Есть ли способ для пакетного файла (в данном случае работающего в Windows XP) определить, был ли он запущен из командной строки (т.е. внутри консольного окна) или запущен через оболочку (например, двойным щелчком)?
У меня есть сценарий, который я хотел бы приостанавливать в определенных местах при запуске через оболочку, но не при запуске из командной строки. Я видел похожий вопрос на SO, но не могу использовать то же решение по двум причинам: во-первых, пауза должна зависеть от множества факторов, одним из которых является двойной щелчок. Во-вторых, я буду распространять этот сценарий среди других членов моей команды, и я не могу реально попросить их всех внести изменения в реестр, которые повлияют на все сценарии.
Возможно ли это?
Нашел :-) - После отчаянных размышлений о том, что cmd
может делать при интерактивном запуске, но не при прямом запуске пакетного файла... я наконец нашел.
Псевдопеременная %cmdcmdline%
содержит командную строку, которая была использована для запуска cmd
. В случае, если cmd
был запущен обычным образом, это содержит что-то вроде следующего:
"C:\Windows\System32\cmd.exe"
Однако при запуске пакетного файла это выглядит так:
cmd /c ""C:\Users\Me\test.cmd" "
Небольшая демонстрация:
@echo off
for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set DOUBLECLICKED=1
if defined DOUBLECLICKED pause
Этот способ проверки может быть не самым надежным, однако /c
должен присутствовать в качестве аргумента, только если пакетный файл был запущен напрямую.
Проверено здесь на Windows 7 x64. Он может работать или не работать, ломаться, делать что-то странное, есть детей (возможно, это хорошо) или укусить вас за нос.
Одним из подходов может быть создание файла autoexec.nt в корне c:\, который будет выглядеть примерно так:
@set nested=%nested%Z
В вашем пакетном файле проверьте, является ли %nested% "Z" - если это "Z", то вас дважды щелкнули, поэтому сделайте паузу. Если это не "Z" - это будет "ZZ" или "ZZZ" и т.д., поскольку CMD наследует блок окружения родительского процесса.
-Oisin