web-dev-qa-db-fra.com

Script batch avec pour boucle et pipe

Je voudrais tous les fichiers csv dans un répertoire dont le nom de fichier ne contient pas Word "summary". Dans l'invite de commande, je peux taper la commande suivante

dir /b my_dir\*.csv | find /V "summary"

Lorsque j'essaie de transférer la commande ci-dessus dans un fichier de commandes, le problème est que la commande de canal n'est pas prise en charge dans la boucle for. C'est que je ne peux pas faire ce qui suit

FOR /f %%A in ('dir /b my_dir\*.csv | find /V "summary"') do (
rem want to do something here
)

Quelqu'un peut-il m'expliquer comment résoudre le problème ci-dessus?

Merci d'avance!

22
Gilbeg

Vous devez échapper le caractère | pour éviter qu'il ne soit interprété au moment de en analysant la commande de boucle . Utilisez ^ pour y échapper:

FOR /f "delims=" %%A in ('dir /b "my_dir\*.csv" ^| find /V "summary"') do (
rem do what you want with %%A here
)

Une fois échappé, le | fait partie de la chaîne délimitée par '-. Il est uniquement interprété comme un symbole spécial lorsque cette chaîne est analysée séparément de la boucle, comme une "sous-commande", conformément à la syntaxe. Et cela se fait après en analysant la boucle.

47
Andriy M

Si vous rencontrez le problème que Gilbeg a rencontré "find:/V ': Aucun fichier ou répertoire de ce type", il est fort probable que vous ayez cygwin, ou similaire, dans votre chemin et que le fichier de commandes n'utilise pas la commande de recherche Windows. Si vous modifiez votre script pour utiliser le chemin absolu de la recherche Windows, l'erreur disparaîtra:

FOR /f "delims=" %%A in ('dir /b "my_dir\*.csv" ^| %SYSTEMROOT%\system32\find.exe /V "summary"') do (
rem want to do something here with %%A
)
5
kxs

Vous pouvez également simplement incorporer une chaîne entre guillemets doubles dans la chaîne de guillemets simples, comme dans:

 FOR/f "delims =" %% A in ('"dir/b mon_dir\*. Csv | find/I/V" résumé ""') do @ (
 ECHO Faire quelque chose avec un"
)
0
David Rogers