Lire le flux stdin dans un fichier batch

est-il possible d'utiliser un flux STDIN à l'intérieur d'un fichier batch?

je veux pouvoir rediriger la sortie d'une commande dans mon fichier batch process.bat liste de la sorte:

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?

30
demandé sur n611x007 2011-08-08 12:57:47

4 réponses

set /p ne fonctionne pas avec les pipes, 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 ne fonctionne pas avec les lignes commençant par un point-virgule (comme le standard de boucle de fin de vie est ;).

Et il ne peut pas lire les lignes vides.

Mais avec findstr vous pouvez résoudre cela aussi, il préfixe chaque ligne avec le numéro de ligne, de sorte que vous ne recevez jamais les lignes vides.

Et puis l' le préfixe est enlevé au premier côlon.

@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 pourraient suffire. find accepte une chaîne de recherche nulle "", et permet l'inversion de recherche. Cela permettrait à quelque chose comme ceci:

@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" %%a in ('find /v ""') do (
  set "line=%%a"
  echo(!line!
)
33
répondu jeb 2016-02-25 17:11:29

Le jeu "line=!line:*:=!" la syntaxe est:

  1. jeu nécessite 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 ne vois pas

  2. !line:*:=!

    Pour cette syntaxe, vous pouvez taper 'set /?' pour voir la description officielle sur l'utilisation des variables.

    !var!%var%, pour obtenir la valeur. Mais !var! moyen expansion retardée.

var nom

le premier: marque de modification variable.

**:= **:=(vide), remplacer la chaîne de caractères dans la valeur de la variable correspond "*:"(virtuellement du début de la chaîne à la première : occurence) avec (vide), c'est-à-dire supprimer la chaîne du début au premier deux-points.

3
répondu YumeYao 2012-09-27 15:37:25
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
répondu Amr Ali 2014-11-25 19:47:15

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

@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" %%a in ('find /v ""') do (
  set "line=%%a"
  echo(!line!
)
1
répondu Dan 2016-02-25 16:18:04