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

54

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. Setzen Sie pausenach Batch-Programmen eine Zeile, um den Benutzer aufzufordern, vor dem Beenden eine Taste zu drücken
  2. Ausführen dieser Batchdateien oder anderer Befehlszeilen-Manipulationstools (auch Starten, Neustarten von Diensten usw. mit net start xyoder ähnlichem) in cmd.exe(Start - Ausführen - cmd.exe)
  3. Führen Sie diese Programme folgendermaßen aus cmd /k: 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. B. beim Ausführen einer Verknüpfung über das Startmenü (oder von einer anderen Stelle) ODER
  2. Findet es ein bisschen unangenehm, cmd.exe ständig auszuführen, und hat 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 cmd.exebeim expliziten Öffnen gelesen , indem ein AutoRun-Eintrag erstellt und dessen Inhalt an folgenden Stellen bearbeitet wurde :

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

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

Ich habe es cmd /d /kals 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, wenn es explizit geöffnet wurde (Start-Ausführen-Befehl). cmd.exe).

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

Sk8erPeter
quelle
10
Ihre Frage mit all den Erklärungen ließ meinen Kopf explodieren. Können Sie etwas sagen wie: Ich möchte eine Batch-Datei mit diesem "Beispiel" -Befehl ausführen, und ich möchte, dass das Befehlsfeld geöffnet bleibt, wenn Sie fertig sind. Fragen Sie das? Bitte geben Sie ein genaues Beispiel des Codes ein.
KCotreau
1
+1 Einverstanden. Bitte überdenken Sie Ihre Frage ein wenig, und verwenden Sie nach Möglichkeit ein Beispiel, um eine prägnantere Frage zu verfassen.
Slotishtype
2
Dies ist ein normales Verhalten, und obwohl Ihre Frage mit Sicherheit gültig ist, sollten Sie sich fragen, warum Sie die Eingabeaufforderung danach geöffnet lassen müssen (die meisten Dienstprogramme werden unter Berücksichtigung dieser Einschränkung erstellt).
Durchbruch
1
Meiner Meinung nach ist dies keine echte Frage. Sie weisen den Benutzer lediglich an, stattdessen eine Stapeldatei zu verwenden. Wenn dies nicht die Absicht der Frage ist, klären Sie Ihre Frage, indem Sie verwirrende Informationen entfernen und erklären, was Ihr eigentliches Ziel ist. Es ist schwer, die richtige Antwort zu finden, wenn es unklar ist ...
Tamara Wijsman
1
@Randolf Richardson, das liegt daran, dass diese Tools für Endbenutzer niemals sichtbar sein sollten (schließlich verwenden wir jetzt GUIs). Wenn Sie solche Informationen benötigen, senden die meisten IT-Gruppen Batch-Dateien, um die entsprechenden Systeminformationen zu sammeln und anzuzeigen. Ich kann mir nicht vorstellen, dass eine Lösung für diese Frage weniger Probleme verursacht als sie löst. Es werden so viele Dinge stdoutfortlaufend gesendet, die aus gutem Grund nie sichtbar sein sollten.
Durchbruch

Antworten:

27

Ich habe eine Lösung, die nur für .cmdund .batDateien gelten kann :

Öffne regeditund gehe zu jedem von:

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

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

Beachten Sie, dass dies der Verwendung ähnelt cmd.exe /c cmd.exe /k program.bat, was bedeutet, dass eine andere CMD-Instanz in der übergeordneten Instanz gestartet wird. Ich konnte das erste /cArgument nicht überschreiben .

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

not2qubit
quelle
4
+1 für die einzige Lösung, die die gestellte Frage tatsächlich beantwortet. Leider denke ich, dass dies ein Speicherleck sein könnte, das darauf wartet, passiert zu werden. Was passiert, wenn ein Dienst eine neue Batch-Datei startet, ohne CMD.EXE in der CMD-Zeile anzugeben? Wird dieser Code in diesem Fall nicht verwendet? Wird dadurch nicht ein neues Fenster auf einem nicht interaktiven Desktop erstellt und geöffnet, bis Sie neu starten?
krowe2
@APerson Ihre Bearbeitung hat den Befehl abgebrochen, indem die *. Bitte seien Sie beim Bearbeiten vorsichtiger!
not2qubit
@ not2qubit Sorry, habe nicht bemerkt, dass ich drei statt zwei Sternchen gelöscht habe. Wird besorgt.
APerson
17

Microsoft zitieren :

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

Mit anderen Worten, das Win32-Konsolenfenster wird immer geschlossen, wenn das zuletzt 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" an. 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.)

Grawity
quelle
13
+1, um zu verstehen, wie und warum Konsolenfenster geschlossen werden (im Gegensatz zu den meisten, die nur "OMG WARUM ES NICHT GEÖFFNET BLEIBEN KANN !!!!!!!!!!! 1111one" sagen). Es verhält sich so, wie es entworfen wurde, und es sollte so bleiben, IMHO. Dies ist der Hauptgrund, warum wir in erster Linie Standard-Streams und Batch-Dateien haben.
Durchbruch
27
@ Durchbruch Die Frage ist How can I do X, nicht In your opinion, should I do X. Diese Antwort ist nicht hilfreich und impliziert, dass X nicht möglich ist, wenn bereits an anderer Stelle Teillösungen vorgestellt wurden. (-1)
Superbest
7

Ö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. Klicken Sie mit der rechten Maustaste und wählen Sie "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

Lee Harrison
quelle
1
Ich wusste nichts über Umschalt + Rechtsklick. Sie können die EXE-Datei jedoch auch per Drag & Drop in ein Cmd-Fenster ziehen, das den Pfad automatisch für Sie einfügt.
Super am
1
Das funktioniert normalerweise für mich, aber es ist anscheinend keine sichere Sache, weil ich hier auf der Suche nach einer Lösung bin, weil es in meiner aktuellen Situation nicht funktioniert.
RenniePet
Dies ist die einfachste Lösung und muss als die richtige Antwort markiert werden
Vicky Kapadia
4

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

cmd.exe /k cmd /c ...

Um dies standardmäßig für alle Batch-Dateien 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" %*.

Wernight
quelle
1
Ich dachte, das "%*"übergibt die vollständige Parameterliste, also würde dies den ersten Parameter nicht zweimal übergeben, immer "%1"wieder als ersten Parameter von "%*"?
Kevin Fegan
1
@KevinFegan Ich habe den Grund nicht überprüft, aber% 1 sollte die Anführungszeichen beibehalten, was bedeutet, dass es in einigen Fällen möglicherweise doppelte Anführungszeichen gibt. Es gibt auch einen Unterschied zwischen %1 %2 %3 ..und an %*den ich mich momentan nicht erinnere, aber das %1 %2 %3funktioniert in einigen Fällen, in denen es %*nicht funktioniert .
Wernight
3

Ich habe gerade eine blöde Lösung gefunden, nachdem ich grawitydie Antwort 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 zu setzen und einige Doskey-Aliase zu konfigurieren und in die Shell zu kopieren.

Meine Lösung (gerade auf Win7 getestet) als cmdletzte 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 Batch-Prozess offen, bis Sie EXIT ausführen. Zu diesem Zeitpunkt verfügt der Batch über keine untergeordneten Prozesse und wird auch beendet.

kitsu.eb
quelle
2

Anstatt PAUSE zu verwenden (ich bevorzuge CHOICE oder TIMEOUT, wenn nötig, PAUSE), können Sie die folgende Lösung verwenden: 886848 / Windows-Batch-Datei-Pause-beim-Doppelklicken-erstellen .

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.

Sie können mehr unter dem angegebenen Link lesen, aber die Grundlage dafür ist, dass die Umgebungsvariable verwendet wird:

%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
Kevin Fegan
quelle
1

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

agradl
quelle
Das funktioniert, ich habe nur den Namen der ausführbaren Eingabeaufforderung in eine bat-Datei (1.bat) geschrieben, die mit dem Befehl start aus einer zweiten bat-Datei "start 1.bat" aufgerufen wird. Befehlsfenster bleibt offen.
Ejectamenta
1

Dies funktioniert für die 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, die so etwas wie heißt, cmdbatfile-open.regund führen Sie sie aus!

VumC
quelle
2
Willkommen bei Stack Exchange! Ich habe die Formatierung in Ihrer Antwort für Sie festgelegt. Hier finden Sie die Formatierungshilfe. Wenn Sie eine Postleitzahl eingeben, denken Sie bitte daran, die genaue Funktionsweise zu erläutern. Möglicherweise möchten Sie auch die Anleitungen zur Beantwortung lesen .
Blacklight Shining
1

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 Chargen A.batund B.bat.

Der Einfachheit halber könnten Sie eine Batch-Datei haben, um beide zu starten. Nennen wir das launch_both.batmit Inhalt:

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

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

François
quelle
0

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.

Jaycode
quelle
Denken Sie daran , wurde die Frage gestellt , bevor Windows 10 (Vor 5 Jahren), bitte bearbeiten Sie Ihre Antwort mit mehr Informationen
yass
0

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. Die Antwort von PSIXO 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.

Henry
quelle