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:
- Setzen Sie
pause
nach Batch-Programmen eine Zeile, um den Benutzer aufzufordern, vor dem Beenden eine Taste zu drücken - Ausführen dieser Batchdateien oder anderer Befehlszeilen-Manipulationstools (auch Starten, Neustarten von Diensten usw. mit
net start xy
oder ähnlichem) incmd.exe
(Start - Ausführen - cmd.exe) - 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:
- 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
- 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.exe
beim 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 /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, 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?
quelle
stdout
fortlaufend gesendet, die aus gutem Grund nie sichtbar sein sollten.Antworten:
Ich habe eine Lösung, die nur für
.cmd
und.bat
Dateien gelten kann :Öffne
regedit
und gehe zu jedem von:Ä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/c
Argument 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.quelle
*
. Bitte seien Sie beim Bearbeiten vorsichtiger!Microsoft zitieren :
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.)
quelle
How can I do X
, nichtIn 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)Ö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
quelle
cmd.exe /k
wird Ihnen Probleme mit einer Charge geben. Wenn der Batchexit 1
(ohne/B
) wird Ihre Konsole geschlossen. Ein Trick ist zu verwenden:Um dies standardmäßig für alle Batch-Dateien zu verwenden, setzen Sie
HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)
undHKEY_CLASSES_ROOT\batfile\shell\open\command\(default)
auf"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*
.quelle
"%*"
übergibt die vollständige Parameterliste, also würde dies den ersten Parameter nicht zweimal übergeben, immer"%1"
wieder als ersten Parameter von"%*"
?%1 %2 %3 ..
und an%*
den ich mich momentan nicht erinnere, aber das%1 %2 %3
funktioniert in einigen Fällen, in denen es%*
nicht funktioniert .Ich habe gerade eine blöde Lösung gefunden, nachdem ich
grawity
die 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
cmd
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 Batch-Prozess offen, bis Sie EXIT ausführen. Zu diesem Zeitpunkt verfügt der Batch über keine untergeordneten Prozesse und wird auch beendet.quelle
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:
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:
quelle
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
Das erste Fenster wird sofort geschlossen, das Fenster, in dem go.bat ausgeführt wird, bleibt jedoch geöffnet
quelle
Dies funktioniert für die Version 5.00 des Windows-Registrierungseditors.
Speichern Sie die obigen Befehle in einer Datei, die so etwas wie heißt,
cmdbatfile-open.reg
und führen Sie sie aus!quelle
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.bat
undB.bat
.Der Einfachheit halber könnten Sie eine Batch-Datei haben, um beide zu starten. Nennen wir das
launch_both.bat
mit Inhalt:Es funktioniert möglicherweise nicht wie erwartet, wenn Sie
exit
eine der beiden Batchdateien aufrufen . Das muss getestet werden.quelle
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:
Dieser Code wartet vor dem Schließen auf eine Eingabe.
quelle
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:
Auf der anderen Seite:
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.
quelle