Определение запуска / выполнения пакетного сценария из командной строки (cmd) -или- Приостановить или не приостановить? - PullRequest
23 голосов
/ 23 февраля 2012

Мне нравится иметь типичную строку "using:" в моих cmd.exe сценариях - если параметр отсутствует, пользователю дается простое напоминание о том, как должен использоваться сценарий.

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

Так что я ищу способ обнаружить это.

@echo off
if _%1_==__ (
    echo usage: %nx0: filename
    rem now pause or not to pause?
)

Есть ли хорошее решение для этого?

Ответы [ 9 ]

16 голосов
/ 24 февраля 2012

Вы можете проверить значение переменной %CMDCMDLINE%.Он содержит команду, которая использовалась для запуска cmd.exe.

Я подготовил тестовый файл .bat:

@Echo Off
echo %CMDCMDLINE%
pause

При запуске из открытого окна cmd.exe скрипт печатает "C:\Windows\system32\cmd.exe".При двойном щелчке он печатает cmd /c ""C:\Users\mbu\Desktop\test.bat" "

. Чтобы проверить, был ли ваш скрипт запущен двойным щелчком, вам нужно проверить, содержит ли %cmdcmdline% путь к вашему сценарию.Окончательное решение выглядело бы так:

@echo off

set interactive=1
echo %cmdcmdline% | find /i "%~0" >nul
if not errorlevel 1 set interactive=0

rem now I can use %interactive% anywhere

if _%1_==__ (
    echo usage: %~nx0 filename
    if _%interactive%_==_0_ pause
)

Редактировать: реализованы исправления ошибок, обсуждаемые в комментариях;отредактированный пример, чтобы продемонстрировать их

5 голосов
/ 27 сентября 2012
:: exit if not interactive
echo %CMDCMDLINE% | find /i "/c"
if not ERRORLEVEL 1 goto:eof
1 голос
/ 02 февраля 2018

Запустите пакетную проверку% WINDIR% в% cmdcmdline% следующим образом:

echo "%cmdcmdline%" | findstr /ic:"%windir%" >nul && (
  echo Interactive run of: %0 is not allowed
  pause
  exit /B 1
)
1 голос
/ 03 января 2016

Это только с использованием внутренней команды.так эффективно ....

EnableDelayedExpansion

if "!cmdcmdline!" neq "!cmdcmdline:%~f0=!" pause >nul

или

if not "!cmdcmdline!" == "!cmdcmdline:%~f0=!" pause >nul

DisableDelayedExpansion

if "%cmdcmdline%" neq "%cmdcmdline:%~f0=%" pause >nul

или

if not "%cmdcmdline%" == "%cmdcmdline:%~f0=%" pause >nul
1 голос
/ 24 февраля 2012

Здесь я что-то написал ...

Usage.bat


@echo off
if arg%1==arg goto help
goto action

:action
echo do something...
goto end

:help
set help1=This is Help line 1.
set help2=This is Help line 2.
cmd.exe /k "echo %help1% &echo %help2%"
goto end

:end

Это не идеально, но работает! : D

-joedf

0 голосов
/ 03 октября 2018
setlocal EnableDelayedExpansion

if "!cmdcmdline!" neq "!cmdcmdline:%comspec%=!" ( pause>nul )

Тест проводится в Windows 10. Использование% windir% немного опасно или неоднозначно. Так что% comspec% супер-безопасный.

0 голосов
/ 16 июля 2018

Подобный подход ...

setlocal

set startedFromExplorer=
echo %cmdcmdline% | find /i "cmd.exe /c """"%~0""" >nul
if not errorlevel 1 set startedFromExplorer=1

...

if defined startedFromExplorer pause
goto :EOF
0 голосов
/ 29 января 2015

для внутренней команды

setlocal EnableDelayedExpansion
set "cmddiff=!cmdcmdline:~0,1!" & if !cmddiff! neq ^" ( pause >nul )
endlocal

или

setlocal EnableDelayedExpansion
set "cmddiff=!cmdcmdline:~28,1!" & if !cmddiff! neq ^" ( pause >nul )
endlocal

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

0 голосов
/ 28 января 2015

Пожалуйста, используйте findstr

echo %cmdcmdline% | findstr /ic:"%~f0" >nul && ( pause >nul )

или

setlocal EnableDelayedExpansion
.
.
echo !cmdcmdline! | findstr /ic:"%~f0" >nul && ( pause >nul )
.
.
endlocal

Это всегда работает ...

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