web-dev-qa-db-ja.com

WindowsコマンドラインのForeachループ?

フォルダAからフォルダBにファイルをコピーするコマンドラインがあります。

copy A\* B\

ここで、Aに存在するBのすべてのファイルを非再帰的に削除したいと思います。私はこのようにAのファイルをリストすることができます:

dir /b /a-d A

出力は次のとおりです。

f0.txt
f1.txt
f2.txt

これが私がやりたいことの擬似コードです:

foreach $1 in <dir /b /a-d A output>:
  del B\$1

別のコマンドの出力を入力として使用して、コマンドを実行するWindowsコマンドライン構文はありますか?私は配管演算子(|)を知っていますが、これを使用してこのタスクを実行する方法を知りません。どんな助けでもいただければ幸いです。

制約事項:Windows7でデフォルトで使用できるコマンドのみ。

12
Adam S

次のファイルを反復処理できます

for %x in (*) do ...

これは、このユースケースのコマンドの出力を反復しようとするよりもはるかに堅牢です。

そう

for %f in (A\*) do del "B\%~nxf"

または、コマンドラインではなくバッチファイルでこれが必要な場合:

for %%f in (A\*) do del "B\%%~nxf"

%~nxfは各ファイルのファイル名と拡張子のみを返します。これはプレフィックスがA\であり、Bで削除するためです。

> nul 2>&1を追加して、出力を抑制します(存在しないファイルを削除しようとするとエラーメッセージが表示される場合があります)。


完全を期すために、実際には、ほぼ同じ方法でコマンドの出力を繰り返すことができます。

for /f %x in ('some command') do ...

ただし、これを行うにはいくつかの問題があり、dir出力を反復処理する場合、それが必要になることはめったにないため、お勧めしません。


また、Windows 7を使用しているため、PowerShellも使用できます。

Get-ChildItem A\* | ForEach-Object { Remove-Item ('B\' + $_.Name) }

以下:

ls A\* | % { rm B\$($_.Name) }
16
Joey