web-dev-qa-db-ja.com

forループとパイプを使用したバッチスクリプト

ファイル名にWordの「要約」が含まれていないディレクトリ内のすべてのcsvファイルが欲しい。コマンドプロンプト内で、次のコマンドを入力できます。

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

上記のコマンドをバッチファイルに転送しようとすると、パイプコマンドがforループでサポートされていないという問題が発生します。つまり、次のことはできません

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

上記の問題を解決する方法について誰かが私にいくつかの光を当てることはできますか?

前もって感謝します!

24
Gilbeg

ループコマンドの解析のときに解釈されないようにするには、|文字をエスケープする必要があります。エスケープするには^を使用します。

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

エスケープすると、|'で区切られた文字列の一部になります。構文によると、その文字列がループとは別に「サブコマンド」として解析される場合にのみ、特別なシンボルとして解釈されます。そして、それが行われますループの解析。

49
Andriy M

Gilbegが「find:/ V ':No such file or directory」という問題に遭遇した場合、パスにcygwinなどがあり、バッチファイルがWindowsのfindコマンドを使用していない可能性があります。 Windowsの検索の絶対パスを使用するようにスクリプトを変更すると、エラーは解消されます。

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

次のように、二重引用符で囲まれた文字列を単一引用符で囲まれた文字列の中に埋め込むこともできます。

 FOR/f "delims =" %% A in( '"dir/b my_dir\*。csv | find/I/V" summary ""')do @(
 ECHO何かするとともに"
)
1
David Rogers