web-dev-qa-db-fra.com

Lire le flux stdin dans un fichier de commandes

Est-il possible d'utiliser un flux stdin canalisé dans un fichier batch?

Je veux pouvoir rediriger la sortie d'une commande dans mon fichier batch process.bat liste donc:

C:\>someOtherProgram.exe | process.bat

Ma première tentative ressemblait à:

echo OFF
setlocal

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

endlocal
:End

Quand je le teste avec type testFile.txt | process.bat il imprime la première ligne à plusieurs reprises.

Y a-t-il un autre moyen?

35
m0tive

set /p ne fonctionne pas avec les canaux, il prend une ligne (au hasard) de l'entrée.
Mais vous pouvez utiliser more à l'intérieur d'une boucle for.

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

Mais cela échoue avec les lignes commençant par un point-virgule (car la norme FOR-LOOP de eol est ;).
Et il ne peut pas lire les lignes vides.
.
Et puis le préfixe est supprimé au premier deux-points.

@echo off
setlocal DisableDelayedExpansion

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

Alternativement, sur certains environnements (comme WinRE) qui n'incluent pas findstr, une alternative avec find.exe pourrait suffire. find acceptera une chaîne de recherche nulle "", et permet l'inversion de la recherche. Cela permettrait quelque chose comme ceci:

@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" %%a in ('find /v ""') do (
  ...
35
jeb

L'ensemble "line=!line:*:=! "la syntaxe est:

  1. set requiert un paramètre qui est a=b.
    Si a contient un espace ou quelque chose, vous devrez utiliser les guillemets autour de ce paramètre. Ici je n'en vois pas

  2. !line:*:=!
    Pour cette syntaxe, vous pouvez taper 'set /? 'pour voir la description officielle de l'utilisation des variables.
    !var! est comme %var%, pour obtenir la valeur. Mais !var! signifie ( expansion retardée .

nom var ligne

le premier: marque de modification variable.

**:= **:= (vide), remplacez la chaîne dans la valeur de la variable correspond à "*: "(pratiquement du début de la chaîne au premier : occurrence) avec (vide), c'est-à-dire supprimer la sous-chaîne du début au premier deux-points.

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

Source ici: http://www.robvanderwoude.com/unixports.php#TEE

1
Amr Ali

Alternativement, sur certains environnements (comme WinRE) qui n'incluent pas findstr, une alternative avec find.exe pourrait suffire. find acceptera une chaîne de recherche nulle "", et permet l'inversion de la recherche. Cela permettrait quelque chose comme ceci:

@echo off
setlocal DisableDelayedExpansion

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