Find ud af, om flagermusfilen kører via dobbeltklik eller fra cmd-vinduet

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en flagermusfil, der gør en masse ting og lukker cmd-vinduet, hvilket er fint, når brugeren dobbeltklikker batfilen fra explorer. Men hvis jeg kører flagermusfilen fra et allerede åbent cmd-vindue som i cmd> c: \ myfile.bat så vil jeg ikke have flagermusfilen til at lukke cmd-vinduet (END) siden jeg skal gøre andre ting. Jeg har brug for bat dos kommando kode, der vil gøre noget


if (initiated\_from\_explorer) then
else
endif


Er dette muligt ? tak

Bedste reference


\%cmdcmdline\% giver den nøjagtige kommandolinje, der bruges til at starte den nuværende Cmd.exe.



  • Når den startes fra en kommandokonsol, er denne var "\%SystemRoot\%system32cmd.exe".

  • Når startet fra explorer er denne var cmd /c ""{full\_path\_to\_the\_bat\_file}" ";

    Dette indebærer, at du måske også kan kontrollere \%0 -variablen i din flagermusfil, for i dette tilfælde det er altid den fulde sti til flagermusfilen og er altid indeholdt i dobbelt citater.



Personligt ville jeg gå til \%cmdcmdline\% tilgangen (ikke \%O), men vær opmærksom på at begge startkommandoer kan overstyres i registreringsdatabasen ...


Andre referencer 1


Løsning fra 'mousio' er flot; Jeg har imidlertid ikke formået at få det til at fungere i en 'IF' -opgørelse på grund af de dobbelte citater til \%cmdcmdline\% (med eller uden dobbelt citater omkring \%cmdcmdline\%).


Imidlertid fungerer løsningen ved hjælp af \%0 fint. Jeg brugte følgende blokopgørelse, og det virker som en charme:


IF \%0 == "\%~0"  pause


Håber det kan hjælpe.

Andre referencer 2


Et konsolideret svar, der stammer fra meget af de oplysninger, der findes på denne side:


:pauseIfDoubleClicked
setlocal enabledelayedexpansion
set testl=\%cmdcmdline:"=\%
set testr=!testl:\%~nx0=!
if not "\%testl\%" == "\%testr\%" pause



  1. Variabelen 'testl' får hele linjen i cmd-processoropkaldet (pr. mousio) og fjerner alle de irriterende dobbelt citater.

  2. Variablen 'testr' tager 'testl' og fjerner yderligere navnet på det aktuelle batchfilnavn, hvis det foreligger (hvilket vil det være hvis batchfilen blev påkaldt med et dobbeltklik).

  3. Hvis erklæringen ser, om 'testl' og 'testr' er forskellige. Hvis ja, blev batchet dobbeltklikket, så pause; Hvis nej, batch blev indtastet på kommandolinjen, fortsæt.



Hvis du vil gøre noget andet, hvis du opdager et dobbeltklik, kan du naturligvis ændre pause.


Tak allesammen.

Andre referencer 3


Du kan tilføje en kommandolinjeparameter, når du kører fra et CMD-vindue, der ikke eksisterer, når filen er dobbeltklikket. Hvis der ikke er nogen parameter, skal du lukke vinduet. Hvis det ikke er tilfældet, skal du lukke det. Du kan teste parameteren ved hjælp af \%1

Andre referencer 4


Det er ikke kun muligt, men din ønskede adfærd er normal adfærd ved batchfilkørsel, medmindre du gør noget 'specielt':



  • Når du udfører en batchfil ved at dobbeltklikke på den i Stifinder, lukkes cmd-vinduet, når det er gjort;

  • Når batchfilen udføres fra kommandolinjen, vender den simpelthen tilbage til kommandolinjeprompt når det er færdigt - vinduet er ikke lukket;



Så jeg tror, ​​at det spørgsmål, der skal besvares, er hvad du laver i batchfilen, der får kommandovinduet til at lukke, når du udfører det ved kommandolinjen?

Andre referencer 5


Brug exit /b 0, ikke exit


Den førstnævnte vil afslutte hele vejen, hvis den startes fra Windows Stifinder, men vende tilbage til konsollen, hvis den startes fra kommandolinjen.

Andre referencer 6


Som @anishsane ønskede jeg også en pauseerklæring, hvis den blev lanceret fra explorer, men ikke når den blev lanceret fra et kommandovindue.


Her er hvad der fungerede for mig, baseret på @mousios svar ovenstående:


@SET cmdcmdline|FINDSTR /b "cmdcmdline="|FINDSTR /i pushd >nul
@IF ERRORLEVEL 1 (
    @echo.
    @echo Press ENTER when done
    @pause > nul
)


(Intet originalt her, bare at give et fungerende eksempel)

Andre referencer 7


Indsæt dette i begyndelsen af ​​dit BAT eller CMD script og måske ændre hvad der sker i 'if' -klausulen:


:: To leave command window open if script run from Windows explorer.
@setlocal
@set x=\%cmdcmdline:"=\%
@set x=\%x: =\%
@set y=\%x:cmd/c=\%
@if "\%x\%" neq "\%y\%" cmd /k \%0 \%* && exit || exit
@endlocal


Hvad dette gør er, hvis brugeren enten dobbeltklikker eller kalder dette script ved hjælp af 'cmd/c', vil det genstartes med 'cmd/k', som efterlader sessionen, når kommandoen er færdig. Dette giver brugeren mulighed for at EXIT eller måske gøre noget andet.


Grunden til at gøre det på denne måde i stedet for de andre måder, der er forklaret i dette svar, er fordi jeg har fundet situationer, der stadig er ved at bruge citaterne eller andre symboler, ville IF-erklæringen bære på visse situationer i KVOTER og/c og med mellemrum. Så logikken fjerner først alle QUOTES og fjerner derefter alle mellemrum .. fordi der nogle gange er ekstra plads efter fjernelse af citaterne.


set x=\%cmdcmdline:"=\%       <-- removes all quotes
set x=\%x: =\%                <-- removes all spaces
set y=\%x:cmd/c=\%            <-- removes  cmd/c  from the string saving it to  y


Punktet for & exit || exit er så, at hvis ERRORVELVEL før udgangen er 0 (succes) stopper den derefter med at løbe, men også hvis den ikke er 0 (noget fiasko) stopper det også.


Men du kan erstatte denne del:


cmd /k \%0 \%* && exit || exit


med noget lignende


set CALLED\_WITH\_CMD\_C=YES


og lav derefter dine egne forskelle i resten af ​​dit script. Du skal derefter flytte eller fjerne endlocal.


Symbolet 'Front' forrest forhindrer ekkoet, som du kan have, hvis du vil teste.
Brug ikke ekko til eller ekko, da det ændrer indstillingen og påvirker alle efterfølgende scripts, der ringer til dig.

Andre referencer 8


@dlchambers var tæt, men det virkede ikke, da cmdcmdline ikke er en defineret miljøvariabel i nogle tilfælde, men denne version baseret på hans værker er fantastisk for mig:


echo \%cmdcmdline\% | findstr /i pushd >nul
if errorlevel 1 pause

Andre referencer 9


efter at have læst gennem forslagene er dette det, jeg gik med:


set \_\_cmdcmdline=\%cmdcmdline\%
set \_\_cmdcmdline=\%\_\_cmdcmdline:"=\%
set \_\_cmdcmdline=\%\_\_cmdcmdline: =\%
set \_\_cmdcmdline=\%\_\_cmdcmdline:~0,5\%
if "\%\_\_cmdcmdline\%"=="cmd/c" set CMD\_INITIATED\_FROM\_EXPLORER=1
set \_\_cmdcmdline=


som betinget sætter variablen: CMD\_INITIATED\_FROM\_EXPLORER


.. og kan efterfølgende bruges efter behov:


if defined CMD\_INITIATED\_FROM\_EXPLORER (
  echo.
  pause
)


..men spørgsmålet om Powershell, at @Ruben Bartelink nævner, er ikke løst:



  kører ./batch.cmd fra Powershell bruger cmd /c under hætten