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
)