windows命令行上的Foreach循环?

windows命令行上的Foreach循环?,windows,windows-7,command-line,Windows,Windows 7,Command Line,我有一个命令行,可以将文件从文件夹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 foreach$1英寸: 德尔B\$1 是否有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
foreach$1英寸:
德尔B\$1
是否有windows命令行语法可以使用另一个命令的输出作为输入来执行命令?我知道管道操作员(|)但不知道如何使用这种方法来完成此任务。任何帮助都将不胜感激


限制:默认情况下,只有在Windows 7中可用的命令。

您可以使用

for %x in (*) do ...
这也比在这个用例中迭代命令的输出要健壮得多

所以

或者,如果需要在批处理文件中而不是在命令行中使用此命令:

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

您可以添加
-erroraction Silentlycontinue
,以避免A中的某些文件在B中不存在时出现错误
ls A\* | % { rm B\$($_.Name) }