windows命令行上的Foreach循环?
我有一个命令行,可以将文件从文件夹a复制到文件夹B: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命令行语法可以使用另一个命令的输出作为输入来执行命令
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) }