windows - læs stdin stream i en batch fil

Indlæg af Hanne Mølgaard Plasc

Problem



Er det muligt at bruge en piped stdin stream i en batch fil?


Jeg vil gerne kunne omdirigere output fra en kommando til min batchfil process.bat liste således:


C:>someOtherProgram.exe | process.bat


Mit første forsøg lignede:


echo OFF
setlocal

:again
set /p inputLine=""
echo.\%inputLine\%
if not (\%inputLine\%)==() goto again

endlocal
:End


Når jeg tester det med type testFile.txt | process.bat, udskriver den den første linje gentagne gange.


Er der en anden måde?

Bedste reference


set /p virker ikke med rør, det tager en (tilfældigt) linje fra input.

Men du kan bruge more inde i en for-loop.


@echo off
setlocal
for /F "tokens=*" \%\%a in ('more') do (
  echo #\%\%a
)


Men dette fejler med linjer, der begynder med et semikolon (da FOR-LOOP-standarden for eol er ;.


Og det kan ikke læse tomme linjer.

Men med findstr kan du også løse dette, det præficerer hver linje med linnummeret, så du aldrig får tomme linjer.

Og så fjernes præfikset til den første kolon.


@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" \%\%a in ('findstr /n $') do (
  set "line=\%\%a"
  setlocal EnableDelayedExpansion
  set "line=!line:*:=!"
  echo(!line!
  endlocal
)


Alternativt kan et alternativ med find.exe være tilstrækkeligt i nogle miljøer (som WinRE), der ikke inkluderer findstr. find vil acceptere en nullsøgstreng "" og tillader søgning inversion. Dette ville tillade noget som dette:


@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" \%\%a in ('find /v ""') do (
  set "line=\%\%a"
  echo(!line!
)

Andre referencer 1


Sættet 'line=!line:*:=!' syntaks er:



  1. sæt kræver en parameter, der er a=b.

    Hvis en indeholder et mellemrum eller noget, skal du bruge anførselstegnene omkring denne parameter. Her ser jeg ikke noget

  2. !line:*:=!

    For denne syntaks kan du skrive 'set /?' for at se den officielle beskrivelse af brugen af ​​variabler.

    !var! er som \%var\% for at få værdien. Men !var! betyder forsinket ekspansion .



linje var navn


det første: variabel modifikationsmærke.


**:= **:= (tom), erstat streng i variablenes værdi matcher '*:' (stort set fra strengen start til første : forekomst) med (tom) fra start til første kolon.

Andre referencer 2


FOR /F "tokens=1* delims=]" \%\%A IN ('FIND /N /V ""') DO (
    >  CON    ECHO.\%\%B
    >> \%File\% ECHO.\%\%B
)


Kilde her: http://www.robvanderwoude.com/unixports.php#TEE[31]

Andre referencer 3


Alternativt kan nogle alternativer med find.exe i nogle miljøer (som WinRE), der ikke inkluderer findstr nok [[. 29]] acceptere en nullsøgstreng "" og tillader søgning inversion. Dette ville tillade noget som dette:


@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" \%\%a in ('find /v ""') do (
  set "line=\%\%a"
  echo(!line!
)