Foreach loop в командной строке Windows?

У меня есть командная строка, которая копирует файлы из папки A в папку B:

copy A\* B\

Теперь я хотел бы удалить все файлы из 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, который будет выполнять команду, используя вывод другой команды в качестве входа? Я знаю оператора трубопроводов (|), но не знаю, как это можно использовать для выполнения этой задачи. Любая помощь будет оценена.

Ограничение: только команды доступны по умолчанию в Windows 7.

Ответ 1

Вы можете перебирать файлы с помощью

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) }