Обнаружение выполнения командного файла

Предполагая 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

Просто добавьте паузу независимо от того, как она была открыта? Если он был открыт из командной строки, никакого вреда не было сделано, кроме безобидной паузы. (Не решение, а просто мысль, будет ли пауза настолько вредной/раздражающей)