Обнаружение, как был выполнен командный файл - PullRequest
17 голосов
/ 18 декабря 2008

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

Какие-нибудь умные способы сделать это? Я ищу решения, на которые можно было бы положиться, чтобы работать на машине, которая была более или менее настроена с настройками по умолчанию.

Ответы [ 9 ]

14 голосов
/ 18 декабря 2008

Я только что провел быстрый тест и заметил следующее, которое может вам помочь:

  • При запуске из командной строки open переменная% 0 не имеет двойных кавычек по пути. Если скрипт находится в текущем каталоге, путь даже не указан, только имя пакетного файла.
  • При запуске из проводника переменная% 0 всегда заключена в двойные кавычки и содержит полный путь к пакетному файлу.

Этот сценарий не будет останавливаться при запуске из командной консоли, но будет выполняться при двойном щелчке в проводнике:

@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: Было также странное поведение при запуске из Проводника, которое я не могу объяснить. Первоначально, а не

@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 был неправильным.

3 голосов
/ 08 марта 2014

Да. Последний пример Патрика Каффа почти сработал, но вам нужно добавить еще один escape, '^', чтобы он работал во всех случаях. Это прекрасно работает для меня:

set zero=%0
if [^%zero:~0,1%] == [^"] pause

Однако, если имя пакетного файла содержит пробел, в обоих случаях оно будет заключено в двойные кавычки, поэтому это решение не будет работать.

3 голосов
/ 18 декабря 2008

Не забывайте о решении иметь два пакетных файла:
abatfile.bat и abatfile-with-pause.bat
Второй просто вызывает первый и добавляет паузу

2 голосов
/ 01 октября 2015

Вот что я использую:

rem if double clicked it will pause
for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause
1 голос
/ 27 сентября 2017

Один простой способ сделать это описан здесь: http://steve -jansen.github.io / направляющие / окна-периодическое действие сценарии / часть-10-продвинутый 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
1 голос
/ 18 декабря 2008

Я использую параметр "автомод", когда запускаю свои командные файлы из сценариев.

set automode=%7

(Здесь автомод является седьмым заданным параметром.)

Некоторый код следует, и когда файл должен остановиться, я делаю это:

if @%automode%==@ pause
0 голосов
/ 18 декабря 2008

сумасшедшая идея: используйте список задач и анализируйте его результаты. Я написал в тестовом командном файле:

список задач> test.out

и когда я дважды щелкнул по нему, перед процессом списка задач появился дополнительный процесс "cmd.exe", которого не было при запуске скрипта из командной строки (но учтите, что этого может быть недостаточно, если открывает командную строку и затем дважды щелкает командный файл)

0 голосов
/ 18 декабря 2008

Подобно второму пакетному файлу, вы также можете приостановить работу, если определенный параметр не задан (вызывается нажатием).

Это будет означать только один пакетный файл, но при вызове из консоли необходимо указать параметр -nopause или что-то в этом роде.

0 голосов
/ 18 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...