Lassen Sie die Eingabeaufforderung eine Anwendung wie Notepad starten und blockieren, bis sie geschlossen wird

Lassen Sie die Eingabeaufforderung eine Anwendung wie Notepad starten und blockieren, bis sie geschlossen wird

Ich habe ein Batch-Skript und möchte im Wesentlichen, dass dem Benutzer bei jeder Ausführung des Skripts ein geöffnetes Notizblockfenster mit einer Konfigurationsdatei angezeigt wird, die der Benutzer bearbeiten kann. Außerdem möchte ich, dass die Eingabeaufforderung wartet, bis dieses Programm geschlossen wird, um mit der Ausführung fortzufahren und das Programm auszuführen, das diese Konfigurationsdatei verwendet.

Ich möchte dies tun, weil ich keine Benutzereingaben im Batch-Skript mit dem Befehlsstil „set /P“ entgegennehmen möchte und das Parsen zum Lesen und Schreiben in dieser Konfigurationsdatei einrichten muss, die viele zu überprüfende Werte enthält.

Ich glaube, das Standardverhalten unter Windows beim Ausführen eines ausführbaren Programms besteht darin, dass bei „exe“-Dateien das Programm in einem eigenen Prozess geöffnet und die Steuerung sofort an das Skript/die Eingabeaufforderung zurückgegeben wird. Bei „bat“- und „cmd“-Skriptdateien wird das Skript ausgeführt und gewartet, bis die Steuerung an das erste Skript oder die erste Eingabeaufforderung zurückgegeben wird. Dies sollte das Verhalten sein, wenn zumindest das andere Skript mit dem Befehl „CALL“ aufgerufen oder direkt aufgerufen wird.

Ich glaube, dass unter Linux das Standardverhalten für ausführbare Inhalte, also sowohl nativer Maschinencode, der ohne Erweiterung auskommen kann, als auch Skripte wie „sh“-Dateien, blockiert ausgeführt wird, sofern Sie nicht irgendwo in der Eingabezeile das Et-Zeichen („&“) angeben.

Ich versuche also, das blockierende Verhalten unter Windows zu erreichen, da dies unter Linux einfacher ist, und möchte, dass das Schließen des Programms die Fortsetzung des ursprünglichen Skripts auslöst oder die Kontrolle an die Eingabeaufforderung zurückgibt.

Antwort1

Sie können entwederstartBefehl(Reihenfolge der /B /WAITSchalter beachten)

start "" /B /WAIT notepad.exe "somefile"

oder einfach

notepad.exe "somefile"

Gemäß obigem Link:

Wenn Sie eine Anwendung mit einer grafischen Benutzeroberfläche ( GUI) mit 32 Bit ausführen, cmdwartet nicht, bis die Anwendung beendet wird, bevor zur Eingabeaufforderung zurückgekehrt wird.Dieses Verhalten tritt nicht auf, wenn Sie die Anwendung über ein Befehlsskript ausführen.

Bearbeitenin Bezug auf Karans Kommentar:Warum ist /B erforderlich?

/Bstartet eine Anwendung, ohne ein neues Eingabeaufforderungsfenster zu öffnen.

  • Um die Wahrheit zu sagen: Wenn Sie eingrafische BenutzeroberflächenanwendungDannNEINEs wird ein neues Eingabeaufforderungsfenster geöffnet, auch wenn der /BSchalter weggelassen wird.
  • Wenn Sie dagegen einBefehlszeilentool, das Weglassen des /BSchalters führt dazu, dass das Tool in einem neuen Eingabeaufforderungsfenster ausgeführt wird, daswird sofort geschlossennachdem es zu Ende ist undDie gesamte Ausgabe geht verloren.

Daher verwende ich die /B /WAITSchalter aus allgemeinem Grundsatz zusammen: Behalten Sie das gleiche Verhalten bei, unabhängig von der Disposition des gestarteten Programms, und sparen Sie sich das Nachdenken darüber ...

Ergänzungauf Bestellung von /B /WAITSchalternmit Beispielen und weiteren Links von StackOverflow: start /WAIT /Bfunktioniert nicht (das /waitArgument wird ignoriert), während start /B /WAITes funktioniert ...

Antwort2

notepad.exe | echo > NUL

Dies öffnet notepad.exe und die gesamte Ausgabe wird an den Befehl umgeleitet echo > NUL. Um die gesamte Ausgabe umzuleiten, muss das Programm beendet werden. Daher müssen wir warten, bis notepad.exe beendet ist. Die Ausgabe geht an echo. Echo verwendet die Eingabe in keiner Weise und gibt nur etwas an NUL aus. NUL ist ein Standard-Windows-Stream, der nirgendwohin führt.

Antwort3

Beim Verfassen der Frage fiel mir eine Antwort ein, die allerdings nicht genau das von mir beabsichtigte Ergebnis erzielte.

Ich würde das Programm öffnen, das ich öffnen möchte, und den Befehl „Pause“ direkt danach in der Zeile darunter hinzufügen. Dadurch wird die Skriptausführung so lange angehalten, bis der Benutzer das gerade erschienene neue Programmfenster schließt und erkennen muss, dass er das Skript ab diesem Punkt manuell fortsetzen muss. Pause gibt eine Eingabeaufforderung aus, die erklärt, was passiert, um den Benutzer möglicherweise zu informieren („ Press any key to continue . . .“).

Dies ist kein großes Problem, es sei denn, das Skript wird aus irgendeinem Grund minimiert und der Benutzer glaubt, es sei beendet. Es ist auch nicht so toll, weil es die Ausführung des restlichen Skripts nicht automatisch fortsetzt, wenn das Programm geschlossen wird, was der gewünschte Effekt ist.

Antwort4

Folgendes hat bei mir beim Starten von Firefox funktioniert:

start "" /B /WAIT "G:\Programs\Mozilla Firefox\firefox.exe" | pause

verwandte Informationen