it-swarm.com.de

Wie kann verhindert werden, dass die Eingabeaufforderung nach der Ausführung geschlossen wird?

Mein Problem ist, dass es in Windows Befehlszeilenfenster gibt, die unmittelbar nach der Ausführung geschlossen werden. Um dies zu lösen, möchte ich, dass das Standardverhalten so ist, dass das Fenster geöffnet bleibt. Normalerweise kann dieses Verhalten mit drei Methoden vermieden werden, die mir in den Sinn kommen:

  1. Eine pause-Zeile nach Batch-Programmen einfügen, um den Benutzer aufzufordern, vor dem Beenden eine Taste zu drücken
  2. Ausführen dieser Batch-Dateien oder anderer Befehlszeilen-Manipulationstools (auch Starten, Neustarten von Diensten usw. mit net start xy oder ähnlichem) innerhalb von cmd.exe (Start - Ausführen - cmd.exe)
  3. Ausführen dieser Programme mit cmd /k wie folgt: cmd /k myprogram.bat

Es gibt jedoch einige andere Fälle, in denen der Benutzer:

  1. Führt das Programm zum ersten Mal aus und weiß nicht, dass das angegebene Programm in der Eingabeaufforderung (Windows Command Processor) ausgeführt wird, z. Wenn Sie eine Verknüpfung über das Startmenü (oder von einem anderen Ort aus) ausführen, ODER
  2. Es ist etwas unangenehm, cmd.exe ständig auszuführen. und haben nicht die Zeit/Gelegenheit, den Code dieser Befehle überall neu zu schreiben, um eine Pause nach ihnen zu machen oder das explizite Beenden zu vermeiden.

Ich habe einen Artikel über das Ändern des Standardverhaltens von cmd.exe beim expliziten Öffnen gelesen, indem ich einen AutoRun-Eintrag erstellt und dessen Inhalt an folgenden Stellen bearbeitet habe:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(Die AutoRun-Elemente sind _String values_...)

Ich habe cmd /d /k als Wert angegeben, um es zu versuchen, aber das hat das Verhalten der oben genannten Dinge überhaupt nicht geändert ... Es hat nur das Verhalten des Befehlszeilenfensters geändert, als es explizit geöffnet wurde (Start-Ausführen) -cmd.exe).

Wie funktioniert es? Können Sie mir Anregungen zur Lösung dieses Problems geben?

53
Sk8erPeter

Ich habe eine Lösung, die nur für .cmd- und .bat-Dateien gelten kann:

Öffne regedit und gehe zu jedem von:

[HKEY_CLASSES_ROOT\batfile\Shell\open\command]
[HKEY_CLASSES_ROOT\cmdfile\Shell\open\command] 

Ändern Sie nun den "Standardschlüsselwert" in cmd.exe /k "%1" %*. Jetzt bleibt jedes Batch-Skript-Fenster nach seiner Ausführung geöffnet.

Beachten Sie, dass dies der Verwendung von cmd.exe /c cmd.exe /k program.bat gleicht, was bedeutet, dass eine andere CMD-Instanz in der übergeordneten Instanz gestartet wird. Ich konnte nicht finden, wie das erste Argument /c überschrieben werden kann.

Sie können dies auch mit [exefile] tun, aber jetzt wird eine leere Konsolenbox angezeigt, wenn die ausführbare Datei eine GUI hat.

26
user8228

Zitat Microsoft :

Eine Konsole wird geschlossen, wenn der zuletzt angehängte Prozess beendet wird oder FreeConsole aufruft.

Mit anderen Worten, das Win32-Konsolenfenster wird immer geschlossen, wenn das letzte darin ausgeführte Programm beendet wird, und Sie können dies nicht ändern.


(Für 16-Bit-MS-DOS-Programme bietet Windows im Eigenschaftendialog die Option "Beim Beenden schließen". Dies ist jedoch keine Ausnahme vom obigen Verhalten: Es ist der NTVDM-Prozess, der das Fenster geöffnet hält. Diese Option ist auch wieder per programm.)

14
grawity

Öffnen Sie einfach eine Eingabeaufforderung am Speicherort Ihrer Stapeldatei und geben Sie den Namen Ihrer Stapeldatei manuell ein, um sie in diesem Fenster auszuführen.

1. Navigieren Sie zu dem Ordner, in dem sich Ihre ausführbare Datei befindet
2.Umschalt-Rechtsklick und Auswahl von "Command Window from here"
3. Geben Sie den Namen der ausführbaren Datei ein und drücken Sie die Eingabetaste
4.Der Prozess sollte ausgeführt werden, das Fenster sollte jedoch geöffnet bleiben

7
Lee Harrison

cmd.exe /k gibt Ihnen Probleme mit einer Charge. Wenn der Batch exit 1 (ohne /B) ist, wird Ihre Konsole geschlossen. Ein Trick ist zu verwenden:

cmd.exe /k cmd /c ...

Um dies standardmäßig für alle Batchdateien zu verwenden, setzen Sie HKEY_CLASSES_ROOT\cmdfile\Shell\open\command\(default) und HKEY_CLASSES_ROOT\batfile\Shell\open\command\(default) auf"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.

4
Wernight

Ich habe gerade eine dumme Lösung gefunden, nachdem ich die Antwort von grawity gelesen hatte.

Mein Anwendungsfall war das Einrichten einer Konsolenumgebung bei der Arbeit, in der alle vernünftigeren Lösungen blockiert sind. Alles, was ich brauche, ist, PATH einzustellen und einige Doskey-Aliase zu konfigurieren und in die Shell zu kopieren.

Meine Lösung (gerade auf Win7 getestet) als cmd als letzte Zeile in der Batch-Datei hinzufügen. Dadurch wird eine verschachtelte Eingabeaufforderung ausgeführt, die die Umgebung des übergeordneten Elements erbt. Diese untergeordnete Shell hält den Stapelprozess offen, bis Sie EXIT (BEENDEN). Zu diesem Zeitpunkt hat der Stapel keine untergeordneten Prozesse und wird auch beendet.

3
kitsu.eb

Anstatt PAUSE zu verwenden (ich bevorzuge bei Bedarf CHOICE oder TIMEOUT gegenüber PAUSE), können Sie die folgende Lösung verwenden: 886848/Windows-Batch-Datei-Pause-beim-Doppelklicken .

Wenn Sie in Windows Explorer auf eine Batchdatei oder Verknüpfung (Verknüpfung) klicken, kann das Batchdatei-Programm vor dem Beenden angehalten werden, damit Sie die Programmausgabe und alle Fehlermeldungen anzeigen können.

Mit CHOICE können Sie festlegen, dass der Benutzer eine Reihe von Aktionen ausführen kann. Mit TIMEOUT kann das Fenster nach einer Zeitverzögerung (unbeaufsichtigt) geschlossen werden. Wenn Sie die Batchdatei in einem Eingabeaufforderungsfenster ausführen, können diese Pausen ärgerlich sein.

Mit der verknüpften Lösung können Sie entscheiden, ob Sie die Pausen überspringen möchten, wenn die Batchdatei über ein Eingabeaufforderungsfenster ausgeführt wurde.

Weitere Informationen finden Sie unter dem angegebenen Link. Grundsätzlich wird jedoch die Umgebungsvariable verwendet:

%cmdcmdline%

um festzustellen, ob die Batchdatei in einem Befehlsfenster ausgeführt wurde oder nicht.

Also benutzt du es so:

An dem Punkt, an dem die Batchdatei beendet wird, fügen Sie folgenden Code hinzu:

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt
2
Kevin Fegan

Der beste Weg, dies zu umgehen, besteht darin, Ihre Batch-Dateien von einer anderen Batch-Datei mit start aufzurufen.

wenn Sie also normalerweise eine Datei mit dem Namen go.bat ausführen, erstellen Sie eine zweite Batch-Datei mit dem Namen go2.bat

der inhalt von go2.bat wäre einfach

start go.bat

das erste Fenster wird sofort geschlossen, das Fenster, in dem go.bat ausgeführt wird, bleibt jedoch geöffnet

1
agradl

Dies funktioniert für Version 5.00 des Windows-Registrierungseditors.

[HKEY_CLASSES_ROOT\batfile\Shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\Shell\open\command]
@="cmd.exe /k \"%1\" %*"

Speichern Sie die obigen Befehle in einer Datei mit dem Namen cmdbatfile-open.reg und führen Sie sie aus!

1
VumC

Angenommen, Sie haben zwei Batchdateien, die Sie in einer eigenen Instanz starten möchten, und die geöffnet bleiben, wenn die ausführbare Datei beendet wird. Nennen wir diese beiden Stapel A.bat und B.bat.

Der Einfachheit halber könnten Sie eine Batch-Datei haben, um beide zu starten. Nennen wir den launch_both.bat mit dem Inhalt:

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

Es funktioniert möglicherweise nicht wie erwartet, wenn Sie exit in einer der beiden Batchdateien aufrufen. Das muss getestet werden.

1
Francois

Beachten Sie, dass für Benutzer, die Windows 10 verwenden, derzeit keine der oben genannten Antworten für Windows 10 funktioniert.

Wenn Sie unter Windows 10 Zugriff auf das Skript haben, müssen Sie am Ende den folgenden Code hinzufügen:

read

Dieser Code wartet vor dem Schließen auf eine Eingabe.

0
jaycode

Antwort auf herabgestuftes PSIXO - "Diese Antwort war bereits in der Frage enthalten. - Ro Yo Mi 20. Januar 16 um 5:06" - NEIN, es war NICHT. Die vorherigen Antworten lauteten: "Pause", was NICHT funktionierte. PSIXOs Antwort war: "& pause", was funktioniert. Bitte analysieren Sie diese sorgfältig, bevor Sie ein Downgrade durchführen. Ich habe dies über eine IDLE-Eingabeaufforderung ausgeführt, und es hat funktioniert:

    >>> os.system('dir ^ & pause')
    0
    >>> 

Auf der anderen Seite:

    >>> os.system('dir ^ pause')
    1
    >>>

Hat NICHT funktioniert (die cmd-Eingabeaufforderung ist ausgeblendet und hat tatsächlich einen Fehler zurückgegeben (1)). Vielen Dank an PSIXO für die Antwort, die ich brauchte. Henry.

0
Henry