windows - Bestemmer, om batch script er blevet startet/udført fra kommandolinjen (cmd) -eller- For at stoppe eller ikke sætte pause i pause?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg kan godt lide at have en typisk 'brug:' linje i mine cmd.exe scripts — Hvis en parameter mangler, får brugeren en simpel påmindelse om, hvordan scriptet skal bruges.


Problemet er, at jeg ikke sikkert kan forudsige, om potentiel bruger vil bruge GUI eller CLI. Hvis nogen bruger GUI dobbeltklikker dette script i Explorer-vinduet, har de ikke haft chancen for at læse noget, medmindre jeg pause vindue. Hvis de bruger CLI, vil pause forstyrre dem.


Så jeg søger en måde at opdage.


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


Er der en god løsning på dette?

Bedste reference


Du kan tjekke værdien af ​​\%CMDCMDLINE\% variablen. Den indeholder den kommando, der blev brugt til at starte cmd.exe.


Jeg forberedte en test .bat-fil:


@Echo Off
echo \%CMDCMDLINE\%
pause


Når du kører fra indersiden af ​​cmd.exe vinduet, udskriver scriptet "C:Windowssystem32cmd.exe".
Når du kører ved at dobbeltklikke, udskriver den cmd /c ""C:UsersmbuDesktop est.bat" "


For at kontrollere, om dit script blev lanceret ved at dobbeltklikke, skal du kontrollere, om \%cmdcmdline\% indeholder stien til dit script. Den endelige løsning ville se sådan ud:


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


 implementerede rettelser for problemstillinger, der er omtalt i kommentarer redigeret eksempel for at demonstrere dem

Andre referencer 1


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

Andre referencer 2


Her skrev jeg noget ...


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





Det er ikke perfekt, men det virker!: D


-joedf

Andre referencer 3


Dette bruger kun den interne kommando. så effektivt ....



  EnableDelayedExpansion



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


eller


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



  DisableDelayedExpansion



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


eller


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

Andre referencer 4


Start din batch kontrol for\% WINDIR\% i\% cmdcmdline\% som denne:


echo "\%cmdcmdline\%" | findstr /ic:"\%windir\%" >nul && (
  echo Interactive run of: \%0 is not allowed
  pause
  exit /B 1
)

Andre referencer 5


Brug venligst findstr


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


eller


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


Dette arbejdes altid ...

Andre referencer 6


til intern kommando


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


eller


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


Du kan sammenligne de forskellige ting, men det fungerer kun inden for EnableDelayedExpansion. og jeg tror ikke, at dette altid vil blive arbejdet, forårsage Windows-version osv. ..

Andre referencer 7


Lignende tilgang ...


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