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?
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!
)
Le jeu "line=!line:*:=!
" la syntaxe est:
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!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.
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
> CON ECHO.%%B
>> %File% ECHO.%%B
)
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!
)