Приостановка пакетного файла при двойном щелчке, но не при запуске из окна консоли?

Есть ли способ для пакетного файла (в данном случае работающего в Windows XP) определить, был ли он запущен из командной строки (т.е. внутри консольного окна) или запущен через оболочку (например, двойным щелчком)?

У меня есть сценарий, который я хотел бы приостанавливать в определенных местах при запуске через оболочку, но не при запуске из командной строки. Я видел похожий вопрос на SO, но не могу использовать то же решение по двум причинам: во-первых, пауза должна зависеть от множества факторов, одним из которых является двойной щелчок. Во-вторых, я буду распространять этот сценарий среди других членов моей команды, и я не могу реально попросить их всех внести изменения в реестр, которые повлияют на все сценарии.

Возможно ли это?

24
задан Community 23 May 2017 в 12:18
поделиться

2 ответа

Нашел :-) - После отчаянных размышлений о том, что 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 должен присутствовать в качестве аргумента, только если пакетный файл был запущен напрямую.

Works on my machine

Проверено здесь на Windows 7 x64. Он может работать или не работать, ломаться, делать что-то странное, есть детей (возможно, это хорошо) или укусить вас за нос.

35
ответ дан 28 November 2019 в 23:23
поделиться

Одним из подходов может быть создание файла autoexec.nt в корне c:\, который будет выглядеть примерно так:

@set nested=%nested%Z

В вашем пакетном файле проверьте, является ли %nested% "Z" - если это "Z", то вас дважды щелкнули, поэтому сделайте паузу. Если это не "Z" - это будет "ZZ" или "ZZZ" и т.д., поскольку CMD наследует блок окружения родительского процесса.

-Oisin

2
ответ дан 28 November 2019 в 23:23
поделиться