Beeinflusst der Befehl more in Windows nur die Ausgabe oder die Befehlsausführung?

445
Gregg Leventhal

Ich führe einen Software-Build in Visual Studio 2005 unter Windows XP über die Befehlszeile (devenv.exe / rebuild) aus. Ich leitete es zwar weiter und dann wurde mir klar, dass ich nicht Baby sitzen wollte, also gab ich mehr mit Q auf. Jetzt sehe ich nichts im CMD-Fenster. Läuft der Befehl wie üblich und puffert und zeigt STDOUT an, und er wird trotz mehr Quit weiterhin ausgeführt, oder wird dieser Build jetzt nie abgeschlossen?

3
Ich kann sagen, dass der Build in diesem Fall erfolgreich abgeschlossen wurde, aber es wäre dennoch interessant, einige Antworten und Besonderheiten zu hören. Gregg Leventhal vor 10 Jahren 0

2 Antworten auf die Frage

2
sahmeepee

Interessante Frage!

Der Prozess, den Sie an MORE übergeben haben, wird bis zu seinem natürlichen Abschluss oder bis zum Abbruch weiter ausgeführt. Hier ist ein Test, um es zu zeigen:

2 cmd Fenster öffnen.

Bei Aufforderung einen Lauf: ping -n 120 127.0.0.1 | Mehr

Bei Aufforderung zwei ausführen: tasklist | findstr / ich ping

Der Ping wird ungefähr 120 Sekunden lang ausgeführt. Mit einem Standard-Cmd-Fenster wird jedoch in kürzerer Zeit eine volle Seite erreicht (passen Sie den Ping-Befehl entsprechend an).

Sie können in Eingabeaufforderung 2 anzeigen, dass PING weiterhin ausgeführt wird, ob Sie MORE mit "Q" beenden oder nicht. Erst wenn Sie den PING-Befehl vollständig mit Strg + C abschalten oder die vollen 50 Sekunden warten, wird der Ping angehalten.

1
Bob

Ja, morePuffer und der Prozess läuft weiter, auch wenn Sie die Ausgabe nicht scrollen.

Wenn Sie verlassen morefrüh, aber nonexistent pipeFehler kann unter Umständen erscheinen. Dies scheint die Ausführung nicht zu beeinträchtigen und ist wahrscheinlich auf die verwendete Testmethode zurückzuführen.


Wir können mit einer einfachen Batchdatei testen:

@echo off for /l %%a in (1,1,100) do echo %%a msg * done 

Durch das Pipeing in moreist es offensichtlich, dass der Prozess weiterhin ausgeführt wird, unabhängig davon, ob moregescrollt wird oder nicht: Die doneNachricht wird ohne Fortschreiten der Nachricht angezeigt more.

Wenn wir jedoch die Laufzeit so erhöhen und moremit qmid-command beenden:

@echo off for /l %%a in (1,1,10000) do echo %%a msg * done 

Wir erhalten viele Fehlermeldungen:

The process tried to write to a nonexistent pipe. 

Das Meldungsfeld wird weiterhin angezeigt. Beim erneuten Testen mit einem einfachen C # - oder C-Programm wird dieses Verhalten nicht repliziert. Meine Vermutung ist, dass, wenn der Stream bereits geöffnet ist, er normal weiterläuft (keine Ausgabe) - aber der echoBefehl, der in den obigen Tests verwendet wird, versucht, den Stream jedes Mal neu zu öffnen, und sobald das Pipe-Ziel geschlossen ist, ist dies nicht mehr der Fall möglich.