Wie kann ich feststellen, ob eine Batchdatei aus einem Befehlsfenster ausgeführt wurde?

Wie kann ich feststellen, ob eine Batchdatei aus einem Befehlsfenster ausgeführt wurde?

Ich habe eine Batchdatei, die ich durch Doppelklicken auf die Datei im Windows Explorer ausführen möchte. Wenn dies erledigt ist, möchte ich mit einer PAUSE enden, damit das Fenster nicht sofort geschlossen wird.

Wenn die Batchdatei jedoch von einer Befehlsshell ausgeführt wird, möchte ich sie nicht mit einer PAUSE beenden.

Gibt es eine Möglichkeit, innerhalb einer Batchdatei festzustellen, ob sie in einer vom Windows Explorer erzeugten Befehlszeile oder in einer vorhandenen Befehlsshell ausgeführt wird?

Bash stellt die spezielle Umgebungsvariable $- bereit.

Gibt es etwas Ähnliches in cmd.exe?

Antwort1

Keine exakte Lösung, aber Sie können eine Verknüpfung zu Ihrer cmd-Datei erstellen und dem Ziel einen Befehlszeilenparameter hinzufügen. Wenn Sie Ihren cmd vom Explorer aus ausführen müssen, müssen Sie die Verknüpfung starten, nicht die cmd-Datei. In Ihrer cmd-Datei testen Sie den Parameter %1, um festzustellen, ob er von der Verknüpfung (vom Explorer) oder von der Eingabeaufforderung aus gestartet wurde.

Antwort2

Ich habe Genes Vorschlag unter Windows 10 ausprobiert:

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC% " Pause

Aber das hat bei mir nicht funktioniert. ABER, als ich das Leerzeichen am Ende von %COMSPEC% entfernte, funktionierte es:

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC%" Pause

Ich bin nicht dafür bekannt, nur den Originalbeitrag zu kommentieren, würde es aber vorziehen, wenn jemand dies zu Genes Antwort hinzufügt und seine positiv bewertet (da er mir die Grundlage für die Lösung meines Problems gegeben hat).

Antwort3

Ich habe hier eine Lösung zu einer ähnlichen Frage gepostet:886848/So lässt sich eine Windows-Batchdatei bei einem Doppelklick pausieren.

Diese Lösung sollte für Sie funktionieren, ist aber wahrscheinlich etwas komplizierter als nötig.

Ich habe unten eine gekürzte Version gepostet, die einfacher ist und für Sie funktionieren sollte.

Weitere Informationen hierzu finden Sie in der oben verlinkten Lösung. Grundsätzlich wird jedoch die Umgebungsvariable verwendet, %cmdcmdline%um zu ermitteln, ob die Batchdatei aus einem Befehlsfenster ausgeführt wurde oder nicht.

Dies funktioniert, weil der Inhalt der Variablen %cmdcmdline%je nachdem, wie die Batchdatei gestartet wurde, unterschiedlich ist: 1) Durch Klicken auf eine Batchdatei oder Verknüpfung, beispielsweise im Windows Explorer oder auf dem Desktop, oder 2) Durch Ausführen der Batchdatei aus einem Eingabeaufforderungsfenster heraus.

Sie verwenden es also folgendermaßen:

An der Stelle, an der die Batchdatei beendet wird, fügen Sie Code wie diesen hinzu:

set newcmdcmdline=%cmdcmdline:"=-%
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-"
set "result=%errorlevel%"

rem if %result% EQU 0 
rem     this batch file was executed by clicking a batch file 
rem     or a shortcut to a batch file, typically from Windows Explorer 
rem     or the Desktop, or the "Start Menu" ...

rem if %result% NEQ 0 
rem     this batch file was executed from within a Command Prompt

rem if executed from within a Command Prompt: 
rem     go exit the batch script immediately, without pausing. 
rem     since this batch file was executed from within a 
rem     Command Prompt, the command window will remain open. 
rem     You can use either of these to exit the batch file:
rem          goto :EOF
rem          exit /b

if %result% NEQ 0 goto :EOF

rem at this point, we know this batch file was executed by clicking ..., 
rem     NOT from within a Command Prompt. 

rem leave the command prompt window open to allow the user time to 
rem    view the messages on the screen before exiting. Use any of 
rem    these to pause and or interact with the user before exiting: 
rem        pause
rem        echo Message... &pause
rem        set /p "d=Message..."
rem        choice [Options...]
rem            (choice /? Displays help message for the Choice command)
rem        timeout /T wait-time [Options...]
rem            (timeout /? Displays help message for the Timeout command)

timeout /t 10
goto :EOF

Antwort4

Keine der gegebenen Antworten funktionierte in allen Fällen zuverlässig für mich, insbesondere wenn sie vom Desktop über eine Windows-Verknüpfung oder von einem Dateimanager eines Drittanbieters, z. B. FreeCommander, gestartet wurden

Folgendes funktioniert bei mir:

if "%CMDCMDLINE:"=%" == "%COMSPEC%" (
  REM started via windows explorer
) else if "%CMDCMDLINE%" == "cmd.exe" (
  REM started via file manager (e.g. FreeCommander)
) else if "%CMDCMDLINE:"=%" == "%COMSPEC% /c %~dpf0 " (
  REM started in command window
) else (
  REM started from other batch file
)

verwandte Informationen