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





Просто добавить паузу вне зависимости от того, как она была открыта? Если он был открыт из командной строки, никакого вреда не было, кроме безобидной паузы. (Не решение, а просто размышления, будет ли пауза настолько вредной / раздражающей)
Не упустите возможность использовать два командных файла:
.
abatfile.bat и abatfile-with-pause.bat
Второй просто вызывает первый и добавляет паузу
Но как узнать, куда звонить? Я думаю, это возвращает нас к исходному вопросу?
Привет, учусь. Если они запускаются из командной строки, они запускают тот без паузы (потому что вывод все еще будет виден), а если они запускаются двойным щелчком, они дважды щелкают тот, у которого есть пауза, чтобы они могли видеть результаты а затем закройте окно
Подобно второму пакетному файлу, вы также можете приостановить, если определенный параметр не задан (вызывается щелчком).
Это будет означать только один командный файл, но при вызове с консоли необходимо указать параметр -nopause или что-то в этом роде.
Это лучшее ручное решение, но я очень надеюсь на автоматическое. Возможно ветвление в текущем каталоге, которое может быть постоянным при двойном щелчке. В идеале что-то с минимальной настройкой, которое будет работать везде, не прибегая к ярлыкам.
сумасшедшая идея: использовать список задач и анализировать его результаты. Я написал в тестовом командном файле:
список задач> test.out
и когда я дважды щелкнул по нему, перед процессом списка задач был дополнительный процесс "cmd.exe", которого не было, когда сценарий запускался из командной строки (но обратите внимание, что этого может быть недостаточно, если кто-то откроет команду строки оболочки, а затем дважды щелкните командный файл)
Я только что провел быстрый тест и заметил следующее, что может вам помочь:
Этот сценарий не будет приостанавливаться при запуске из командной консоли, но будет, если дважды щелкнуть в проводнике:
@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
Обновлено: Также было странное поведение при запуске из 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
Это будет работать при запуске из открытой командной строки, но при запуске из проводника будет жаловаться, что инструкция if неверна.
Другой вариант:% cmdcmdline% дает точную командную строку, используемую для запуска текущего Cmd.exe. При запуске из командной консоли эта переменная - «% SystemRoot% \ system32.cmd.exe». При запуске из проводника это переменная cmd / c "" [d: \ path \ script.bat] ""
Лично я бы действительно выбрал подход %cmdcmdline%, но имейте в виду, что обе команды запуска могут быть переопределены в реестре!
Я использую параметр "automde", когда запускаю свои командные файлы из скриптов.
set automode=%7
(Здесь автоматический режим является седьмым заданным параметром.)
Далее следует некоторый код, и когда файл должен приостановиться, я делаю это:
if @%automode%==@ pause
Да. Последний пример Патрика Каффа почти сработал, но вам нужно добавить один дополнительный экранирование, '^', чтобы он работал во всех случаях. Это отлично работает для меня:
set zero=%0
if [^%zero:~0,1%] == [^"] pause
Однако, если имя командного файла содержит пробел, оно будет заключено в двойные кавычки в любом случае, поэтому это решение не сработает.
Вот что я использую:
rem if double clicked it will pause
for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause
Здесь описан один простой способ сделать это: 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
У меня это не сработало, как написано, если сценарий запускается с "запускать от имени администратора" .......... Но добавление параметра "/ I" без учета регистра в команде FINDSTR исправило это. Я обнаружил, что у COMSPEC есть различия в корпусе.
Думаю, это будет довольно неприятно, по крайней мере, для меня. Конечно, должна быть какая-то переменная окружения или настройка состояния, которая существует в одном месте, а не в другом, который я мог бы использовать, чтобы сделать выбор!