Angenommen wir den folgenden Code-Schnipsel mit einer Textdatei haben sample.txt
umgeleitet in STDIN
:Warum verarbeiten einige Befehle Zeilen umgeleiteter STDIN-Daten, die bereits von anderen Befehlen verwendet werden?
@echo off
< "sample.txt" (
set /P "ONE="
set /P "TWO="
findstr /R "^"
)
echo %ONE%, %TWO%
... und der Inhalt der zugehörigen Textdatei sample.txt
:
first
second
third
fourth
Die Ausgabe auf dem zurück Konsole wird dies sein, was genau das ist, was ich erwarte (Zeilen first
und second
werden von set /P
verbraucht, daher findstr
empfängt und verarbeitet die restlichen Zeilen):
third fourth first, second
die gleiche Leistung erreicht wird, wenn durch findstr /R "^"
sort /R
ersetzt wird.
Wenn jedoch die findstr
Befehlszeilen von find /V ""
oder durch more
ersetzt, wird der Ausgang sein:
first second third fourth first, second
Es scheint, dass, obwohl set /P
bereits die Linien first
und second
verbraucht, die durch bewiesen die letzte Ausgabezeile, find
und auch more
erhalten immer noch die gesamten umgeleiteten Daten.
Warum ist das, was verursacht dieses Verhalten? Gibt es eine Möglichkeit, find
oder more
zu zwingen, nur die verbleibenden umgeleiteten Daten zu empfangen, die noch nicht von einem vorhergehenden Befehl verarbeitet wurden?
(Das Verhalten ist das gleiche, wenn die Ausgangsdaten STDOUT
in eine Textdatei umleiten. Auch wenn eine Befehlszeile ähnlich der oben Loskennzeichen in cmd
direkt ausgeführt wird, ändert sich nichts.)
Sie können eine Beschreibung dieses Verhaltens [hier] lesen (http://stackoverflow.com/questions/8844868/what-are-the-undoccumed-features-and-limits-of-the-windows-findstr-comman/28278628 # 28278628), aber die Antwort auf Ihre Frage lautet: "weil solche Befehle auf diese Weise programmiert wurden" – Aacini
Sehr interessant, @Aacini! Ich habe schon vermutet, dass 'find' und' more' den Dateizeiger zurücksetzen, weil ich mit allen genannten Befehlen rumgespielt, gemischt und neu geordnet habe, und habe sogar ein 'for/F' um sie gewickelt (zB:' for/F "delims =" %% L in ('mehr') echo (%% L '), was alles überhaupt nichts änderte.Ich fürchte also, es scheint keine (native) Möglichkeit zu geben, dieses Verhalten zu umgehen. – aschipfl
Sie könnten versuchen, das Ergebnis von 'findstr/R"^"' zu "finden"/V "" oder "more" –