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?
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 (
...
L'ensemble "line=!line:*:=!
"la syntaxe est:
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
!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.
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
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!
)