2011-07-04 15:32:05 +0000 2011-07-04 15:32:05 +0000
56
56
Advertisement

Wie kann man verhindern, dass sich die Eingabeaufforderung nach der Ausführung schließt?

Advertisement

Mein Problem ist, dass es in Windows Befehlszeilenfenster gibt, die sich unmittelbar nach der Ausführung schließen. Um dieses Problem zu lösen, möchte ich als Standardverhalten, dass das Fenster offen gehalten wird. Normalerweise lässt sich dieses Verhalten mit drei Methoden vermeiden, die mir in den Sinn kommen:

  1. Einfügen einer pause-Zeile nach Batch-Programmen, um den Benutzer aufzufordern, vor dem Beenden von eine Taste zu drücken 2. Ausführen dieser Batch-Dateien oder anderer Befehlszeilen-Manipulationswerkzeuge (sogar Dienststart, Neustart usw. mit net start xy oder etwas Ähnlichem) innerhalb von cmd.exe(Start - Ausführen - cmd.exe)
  2. Ausführen dieser Programme mit cmd /k wie folgt: cmd /k myprogram.bat

Aber es gibt noch einige andere Fälle, in denen der Benutzer:

  1. Er 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 aus dem Startmenü (oder von irgendwo anders), ODER
  2. Findet es ein wenig unangenehm, cmd.exe die ganze Zeit auszuführen und hat nicht die Zeit/Gelegenheit, den Code dieser Befehle überall neu zu schreiben, um eine Pause danach zu machen oder das explizite Beenden zu vermeiden.

Ich habe einen Artikel darüber gelesen, wie man das Standardverhalten von cmd.exe ändert, wenn man es explizit öffnet, indem man einen AutoRun-Eintrag und die Manipulation seines Inhalts an diesen Stellen:

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

(Die AutoRun-Einträge sind _String values_…)

Ich habe cmd /d /k als Wert von ihm gesetzt, um es auszuprobieren, aber das hat das Verhalten der oben genannten Stuffs überhaupt nicht verändert… Es hat nur das Verhalten des Kommandozeilenfensters geändert, wenn es explizit geöffnet wird (Start-Run-cmd.exe).

Wie funktioniert es also? Können Sie mir irgendwelche Ideen zur Lösung dieses Problems geben?

Advertisement
Advertisement

Antworten (11)

18
18
18
2011-07-04 17:45:20 +0000

Zitat Microsoft :

Eine Konsole wird geschlossen, wenn der letzte mit ihr verbundene Prozess beendet wird oder FreeConsole aufruft.

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


(Für 16-Bit-MS-DOS-Programme bietet Windows eine Option “Schließen beim Beenden” im Eigenschaftsdialog an, aber dies ist keine Ausnahme zu dem obigen Verhalten: es ist der NTVDM-Prozess, der das Fenster offen hält. Auch diese Option ist wieder pro Programm).

8
8
8
2013-03-21 14:10:13 +0000

Öffnen Sie einfach eine Eingabeaufforderung am Speicherort Ihrer Batch-Datei und geben Sie den Namen Ihrer Batch-Datei 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 Umschalt-Rechts-Taste und wählen Sie “Befehlsfenster von hier” 3.geben Sie den Namen der ausführbaren Datei ein und drücken Sie die Eingabetaste 4.der Prozess sollte ausgeführt werden, aber das Fenster sollte offen bleiben

4
Advertisement
4
4
2012-11-06 13:37:01 +0000
Advertisement

cmd.exe /k wird Ihnen Probleme mit irgendeiner Charge bereiten. Wenn der Stapel exit 1 (ohne /B) wird Ihre Konsole geschlossen. Ein Trick ist die Verwendung von:

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" %*.

3
3
3
2014-04-26 16:55:23 +0000

Ich bin gerade auf eine dumme Lösung gestoßen, nachdem ich die Antwort von grawity gelesen hatte.

Mein Anwendungsfall war das Einrichten einer Konsolenumgebung am Arbeitsplatz, in der alle vernünftigeren Lösungen blockiert sind. Alles, was ich brauche, ist die Einstellung von PATH und die Konfiguration einiger Doskey-Aliase und ein Dump in die Shell.

Meine Lösung (gerade unter Win7 getestet) fügt cmd als letzte Zeile in der Batch-Datei hinzu. Dadurch wird eine verschachtelte Eingabeaufforderung ausgeführt, die die Umgebung ihres Elternteils erbt. Diese untergeordnete Shell hält den Stapelprozess offen, bis Sie BEENDEN. Zu diesem Zeitpunkt hat der Stapel keine untergeordneten Prozesse und wird ebenfalls beendet.

2
Advertisement
2
2
2015-12-11 17:02:56 +0000
Advertisement

Angenommen, Sie haben zwei Batch-Dateien, die Sie in ihrer eigenen Instanz starten und offen halten wollen, wenn ihre ausführbare Datei beendet wird. Lassen Sie uns diese beiden Stapel A.bat und B.bat nennen.

Der Einfachheit halber könnten Sie jetzt eine Stapeldatei haben, um beide zu starten, nennen wir das launch_both.bat mit dem Inhalt:

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

Es könnte nicht wie erwartet funktionieren, wenn Sie exit in einer der beiden Stapeldateien aufrufen. Das wird getestet werden müssen.

2
2
2
2013-03-21 20:02:36 +0000

Anstatt PAUSE zu verwenden (ich bevorzuge, wenn nötig, CHOICE oder TIMEOUT gegenüber PAUSE), können Sie die Lösung hier verwenden: 886848/how-to-make-windows-batch-file-pause-when-double-clicked .

Auf diese Weise können Sie, wenn Sie im Windows Explorer auf eine Stapeldatei oder eine Verknüpfung (Verknüpfung) klicken, das Stapeldatei-Programm vor dem Beenden pausieren lassen, damit Sie die Programmausgabe und eventuelle Fehlermeldungen sehen können.

Mit CHOICE können Sie die Möglichkeit programmieren, dass der Benutzer eine Vielzahl von Aktionen auswählen kann, und mit TIMEOUT können Sie das Fenster nach einer Zeitverzögerung (unbeaufsichtigt) schließen lassen. Wenn Sie die Batch-Datei von einem Befehlseingabefenster aus ausführen, können diese Pausen störend sein.

Die verknüpfte Lösung lässt Sie entscheiden, ob Sie die Pausen überspringen wollen, wenn die Batch-Datei von einem Befehlseingabefenster aus ausgeführt wurde.

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

%cmdcmdline%

verwendet wird, um festzustellen, ob die Batch-Datei von einem Befehlsfenster aus ausgeführt wurde oder nicht.

Sie verwenden sie also wie folgt:

An der Stelle, an der die Batch-Datei beendet wird, fügen Sie einen Code wie diesen 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
1
Advertisement
1
1
2013-03-12 15:30:15 +0000
Advertisement

Der beste Weg, den ich gefunden habe, dies zu umgehen, ist der Aufruf Ihrer Batch-Dateien von einer anderen Batch-Datei aus mit start.

Wenn Sie also normalerweise eine Datei namens go.bat ausführen, dann würden Sie eine zweite Batch-Datei mit dem Namen go2.bat erstellen

der Inhalt von go2.bat wäre einfach

start go.bat

das erste Fenster schließt sich sofort, aber dasjenige, das Ihre go.bat ausführt, bleibt offen

1
1
1
2013-09-24 12:30:12 +0000

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 cmds in einer Datei mit dem Namen cmdbatfile-open.reg und führen Sie sie aus!

0
Advertisement
0
0
2017-03-30 08:30:11 +0000
Advertisement

Für Benutzer, die Windows 10 verwenden, beachten Sie, dass keine der obigen Antworten derzeit unter Windows 10 funktioniert.

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

read

Dieser Code wartet auf eine Eingabe, bevor er geschlossen wird.

0
0
0
2019-12-31 21:58:53 +0000

Die Frage des OP ist viel komplizierter als das, was ich brauchte, und daher ist diese Antwort für andere, die hierher kommen und nach einer einfachen Möglichkeit suchen, ein Befehlszeilenprogramm zu starten und das Fenster offen zu halten, nachdem das Befehlszeilenprogramm beendet wurde.

In meinem Fall wollte ich NodeJS ausführen und das Konsolenfenster offen halten, nachdem NodeJS gestoppt wurde. Hier war meine Lösung:

Datei: RunNodeJS.bat

@echo off
cd /d c:\
cmd.exe /k cmd /c node

Ich habe dann eine Verknüpfung zu dieser Datei auf meinem Desktop erstellt und auf die Verknüpfung doppelgeklickt, um eine cmd.exe-Konsole zu starten, die den Knotenbefehl ausführt und geöffnet bleibt, nachdem sie (der Knotenbefehl) beendet wurde.

Ich habe cmd.exe /k cmd /c node verwendet, weil hier eine andere Antwort gegeben wurde.

0
0
0
2017-06-30 03:30:27 +0000

Als Antwort auf den herabgestuften PSIXO - “Diese Antwort war bereits in der Frage enthalten. - Ro Yo Mi 20. Januar 20 ‘16 um 5:06” – NEIN, war sie NICHT. Die vorherigen Antworten waren: “Pause”, die NICHT funktionierte. Die Antwort des PSIXO lautete: “Pause”, was NICHT funktionierte: “& Pause”, die funktioniert. Bitte analysieren Sie vor der Herabstufung sorgfältiger. Ich führte dies von einer IDLE-Eingabeaufforderung aus, und es funktionierte:

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

Andererseits:

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

Funktionierte NICHT (die cmd-Eingabeaufforderung überschlug sich und gab tatsächlich einen Fehler zurück (1)). Vielen Dank an PSIXO für die Antwort, die ich brauchte. Henry.

Advertisement

Verwandte Fragen

3
19
10
28
6
Advertisement