Подтвердить что ты не робот

Определение, было ли запущено/выполнено партию script из командной строки (cmd) -или- Чтобы приостановить или не приостановить?

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

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

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

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

Есть ли хорошее решение?

4b9b3361

Ответ 1

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

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

@Echo Off
echo %CMDCMDLINE%
pause

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

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

@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
)

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

Ответ 2

:: exit if not interactive
echo %CMDCMDLINE% | find /i "/c"
if not ERRORLEVEL 1 goto:eof

Ответ 3

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

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

Ответ 4

Используйте findstr

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

или

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

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

Ответ 5

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

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 и т.д.

Ответ 6

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

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