Supponendo abbiamo il seguente frammento di codice con un file di testo sample.txt
reindirizzato in STDIN
:Perché alcuni comandi elaborano linee di dati STDIN reindirizzati che sono già stati utilizzati da altri comandi?
@echo off
< "sample.txt" (
set /P "ONE="
set /P "TWO="
findstr /R "^"
)
echo %ONE%, %TWO%
... e il contenuto del file di testo relativi sample.txt
:
first
second
third
fourth
L'uscita restituito il console sarà questo, che è esattamente quello che mi aspetto (le righe first
e second
sono consumate da set /P
, quindi findstr
riceve ed elabora le righe rimanenti):
third fourth first, second
La stessa uscita si ottiene quando findstr /R "^"
è sostituito da sort /R
.
Tuttavia, quando si sostituisce la linea findstr
comando find /V ""
o more
, l'uscita sarà:
first second third fourth first, second
Sembra che, sebbene set /P
già consumato le linee first
e second
che è dimostrato dai l'ultima linea di uscita, find
e anche more
continuano a ricevere gli interi dati reindirizzati.
Perché questo è ciò che causa questo comportamento? C'è un modo per forzare find
o more
per ricevere solo i restanti dati reindirizzati che non sono già stati elaborati da un comando precedente?
(il comportamento è lo stesso quando reindirizzare i dati in uscita STDOUT
un file di testo. Inoltre, durante l'esecuzione di una riga di comando simile al codice batch precedente in cmd
direttamente, non cambia nulla.)
Si può leggere una descrizione di questo comportamento [qui] (http://stackoverflow.com/questions/8844868/what-are-the-undocumented-features-and-limitations-of-the-windows-findstr-comman/28278628 # 28278628), ma la risposta alla tua domanda è: "perché tali comandi sono stati programmati in questo modo" – Aacini
Molto interessante, @Aacini! Ho già sospettato che 'find' e' more' resettassero il puntatore del file, perché giocavo con tutti i comandi che ho menzionato, li ho mixati e riordinati, e ho persino avvolto un 'for/F' attorno a loro (come:' per/F "delim =" %% L in ('more') fa echo (%% L'), che non ha cambiato nulla.Quindi temo che non ci sia alcun modo (nativo) per aggirare questo comportamento? – aschipfl
Si potrebbe provare a pipe il risultato di 'findstr/R"^"' per 'trovare/V" "' o 'more' –