Определение, было ли запущено/выполнено партию 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?
)
Есть ли хорошее решение?
Ответы
Ответ 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