Leer stdin stream en un archivo por lotes

¿Es posible usar una stream de stdin entubada dentro de un archivo por lotes?

Quiero poder redirigir la salida de un comando a mi lista de procesos por lotes process.bat así:

 C:\>someOtherProgram.exe | process.bat 

Mi primer bash se parecía a:

 echo OFF setlocal :again set /p inputLine="" echo.%inputLine% if not (%inputLine%)==() goto again endlocal :End 

Cuando lo type testFile.txt | process.bat con el type testFile.txt | process.bat type testFile.txt | process.bat imprime la primera línea repetidamente.

¿Hay otra manera?

set /p no funciona con pipes, toma una línea (aleatoriamente) de la entrada.
Pero puedes usar more dentro de un for-loop.

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

Pero esto falla con las líneas que comienzan con un punto y coma (como lo es el estándar FOR-LOOP de eol ; ).
Y no puede leer líneas vacías.
Pero con findstr puedes resolver esto también, prefija cada línea con el número de canvas, para que nunca tengas líneas vacías.
Y luego el prefijo se elimina a los primeros dos puntos.

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

Alternativamente, en algunos entornos (como WinRE) que no incluyen findstr , una alternativa con find.exe podría ser suficiente. find aceptará una cadena de búsqueda nula "" , y permite la inversión de búsqueda. Esto permitiría algo como esto:

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

La syntax establecida ” line=!line:*:=! ” Es:

  1. set requiere un parámetro que sea a=b .
    Si a contiene un espacio o algo así, deberá usar las comillas alrededor de este parámetro. Aquí no veo ningún

  2. !line:*:=!
    Para esta syntax, puede escribir ‘ set /? ‘para ver la descripción oficial sobre el uso de variables.
    !var! es como %var% , para obtener el valor. Pero !var! significa demora en la expansión .

nombre de línea var

el primero: marca de modificación variable.

**:= **:= (vacío), reemplace la cadena en el valor de la variable que coincida con ” *: ” (virtualmente desde el inicio de cadena a primero : aparición) con (vacío), es decir, elimine la subcadena de inicio a primer punto.

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

Fuente aquí: http://www.robvanderwoude.com/unixports.php#TEE

Alternativamente, en algunos entornos (como WinRE) que no incluyen findstr , una alternativa con find.exe podría ser suficiente. find aceptará una cadena de búsqueda nula "" , y permite la inversión de búsqueda. Esto permitiría algo como esto:

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