Обнаружение выполнения командного файла
Предполагая Windows, есть ли способ, который я могу обнаружить из пакетного файла, если он был запущен из командной строки open или двойным щелчком? Я хотел бы добавить паузу в конце пакетного процесса, если и только если она была дважды нажата, чтобы окно не просто исчезло вместе с любым полезным выходом, который он мог бы создать.
Какие-нибудь умные способы сделать это? Я ищу решения, на которые я мог положиться, чтобы работать на машине, которая была настроена более или менее с настройками по умолчанию.
Ответы
Ответ 1
Я только что проверил быстрый тест и заметил следующее, что может вам помочь:
- При запуске из командной строки open, переменная% 0 не имеет двойных кавычек по пути. Если script находится в текущем каталоге, путь даже не указывается, просто имя командного файла.
- При запуске из проводника переменная% 0 всегда заключена в двойные кавычки и включает полный путь к пакетному файлу.
Этот script не будет приостанавливаться, если он запускается из командной консоли, но если он дважды щелкнут в проводнике:
@echo off
setlocal enableextensions
set SCRIPT=%0
set DQUOTE="
@echo do something...
@echo %SCRIPT:~0,1% | findstr /l %DQUOTE% > NUL
if %ERRORLEVEL% EQU 0 set PAUSE_ON_CLOSE=1
:EXIT
if defined PAUSE_ON_CLOSE pause
EDIT:
Было также странное поведение при работе с Explorer, которое я не могу объяснить. Первоначально, а не
@echo %SCRIPT:~0,1% | findstr /l %DQUOTE% > NUL
if %ERRORLEVEL% EQU 0 set PAUSE_ON_CLOSE=1
Я попытался использовать только if
:
if %SCRIPT:0,1% == ^" set PAUSE_ON_CLOSE=1
Это будет работать при запуске из командной строки open, но при запуске из проводника он будет жаловаться, что оператор if
неверен.
Ответ 2
Не забывайте о решении иметь два пакетных файла:
abatfile.bat и abatfile-with-pause.bat
Второй просто вызывает первый и добавляет паузу
Ответ 3
Да. Последний пример Патрика Каффа почти сработал, но вам нужно добавить один дополнительный побег "^", чтобы он работал во всех случаях. Это отлично работает для меня:
set zero=%0
if [^%zero:~0,1%] == [^"] pause
Однако, если имя командного файла содержит пробел, оно будет двойным в обоих случаях, поэтому это решение не будет работать.
Ответ 4
Вот что я использую:
rem if double clicked it will pause
for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause
Ответ 5
Я использую параметр "automode", когда я запускаю свои командные файлы из скриптов.
set automode=%7
(Здесь автомод - это седьмой параметр.)
Следующий код следует, и когда файл должен приостановиться, я делаю следующее:
if @%automode%[email protected] pause
Ответ 6
Один простой способ сделать это описан здесь: http://steve-jansen.github.io/guides/windows-batch-scripting/part-10-advanced-tricks.html В коде, упомянутом в ссылке, есть небольшая опечатка, Вот правильный код:
@ECHO OFF
SET interactive=0
ECHO %CMDCMDLINE% | FINDSTR /L /I %COMSPEC% >NUL 2>&1
IF %ERRORLEVEL%==0 SET interactive=1
ECHO do work
IF "%interactive%"==1 PAUSE
EXIT /B 0
Ответ 7
Подобно второму пакетному файлу, вы также можете приостановить, если определенный параметр не задан (вызывается нажатием).
Это означало бы только один пакетный файл, но при указании с консоли можно было бы указать параметр -nopause
или что-то подобное.
Ответ 8
сумасшедшая идея: используйте список задач и проанализируйте его результаты.
Я написал в тестовом пакетном файле:
список задач > test.out
и когда я дважды щелкнул его, перед процессом tasklist появился дополнительный "cmd.exe" процесс, которого не было, когда script был запущен из командной строки (но обратите внимание, что этого может быть недостаточно если кто-то открывает оболочку командной строки, а затем дважды щелкните пакетный файл)
Ответ 9
Просто добавьте паузу независимо от того, как она была открыта? Если он был открыт из командной строки, никакого вреда не было сделано, кроме безобидной паузы. (Не решение, а просто мысль, будет ли пауза настолько вредной/раздражающей)