问题 Windows命令行上的Foreach循环?


我有一个命令行,它将文件夹从文件夹A复制到文件夹B:

copy A\* B\

我现在想删除B中存在于A中的所有文件,非递归。我可以像这样列出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中的命令可用。


1640
2018-01-28 17:51


起源



答案:


您可以使用迭代文件

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

15
2018-01-28 18:02



你可以补充一下 -erroraction Silentlycontinue 当B中的某个文件不存在时,避免错误 - mjsr


答案:


您可以使用迭代文件

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

15
2018-01-28 18:02



你可以补充一下 -erroraction Silentlycontinue 当B中的某个文件不存在时,避免错误 - mjsr