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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
5 181
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

Думаю, это будет довольно неприятно, по крайней мере, для меня. Конечно, должна быть какая-то переменная окружения или настройка состояния, которая существует в одном месте, а не в другом, который я мог бы использовать, чтобы сделать выбор!

Dan Olson 18.12.2008 13:26

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

Но как узнать, куда звонить? Я думаю, это возвращает нас к исходному вопросу?

Learning 18.12.2008 13:17

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

hamishmcn 18.12.2008 13:27

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

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

Это лучшее ручное решение, но я очень надеюсь на автоматическое. Возможно ветвление в текущем каталоге, которое может быть постоянным при двойном щелчке. В идеале что-то с минимальной настройкой, которое будет работать везде, не прибегая к ярлыкам.

Dan Olson 18.12.2008 13:37

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

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

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

Ответ принят как подходящий

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

  • При запуске из открытой командной строки путь переменной% 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

Обновлено: Также было странное поведение при запуске из 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] ""

Patrick Cuff 20.12.2008 05:34

Лично я бы действительно выбрал подход %cmdcmdline%, но имейте в виду, что обе команды запуска могут быть переопределены в реестре!

mousio 07.04.2011 03:12

Я использую параметр "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 есть различия в корпусе.

John Rocha 03.07.2018 20:29

Другие вопросы по теме