【问题标题】:Foreach loop on windows command line?windows命令行上的foreach循环?
【发布时间】:2012-02-21 06:42:21
【问题描述】:

我有一个命令行,可以将文件从文件夹 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 中默认可用的命令。

【问题讨论】:

    标签: windows windows-7 command-line


    【解决方案1】:

    你可以遍历文件

    for %x in (*) do ...
    

    这也比尝试迭代此用例的命令输出要强大得多。

    所以

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

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

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

    %~nxf 仅返回每个文件的文件名和扩展名,因为它将以 A\ 为前缀,而您想在 B 中将其删除。

    添加&gt; nul 2&gt;&amp;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中不存在时的错误
    • 假设我有一个很长的列表,如何拆分其中的长行元素?示例:FOR %%G IN (11288211,38948621) DO ( )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2012-06-26
    • 2021-09-15
    • 2014-06-15
    • 1970-01-01
    • 2013-01-25
    • 2023-03-20
    相关资源
    最近更新 更多