在每个子文件夹中运行命令

时间:2009-07-13 10:32:16

标签: windows command-line batch-file

在路径的每个子文件夹中运行命令的最简单方法是什么?在这种情况下,我必须为我的存储库中的每个目录运行svn cleanup。

4 个答案:

答案 0 :(得分:7)

for命令就是你要找的。为了阅读确切的语法类型for /?

例如,为了打印当前目录中所有子目录的名称。您可以使用命令:

for /d /r %i in (*.*) do @echo %i

echo%i部分是您必须根据自己的情况更改的部分。

答案 1 :(得分:3)

我发现在这种情况下,删除工作副本和重新结账更容易。如果您有本地更改,请先将更改的文件复制到其他位置。

但是Can's answer可能适用于你的情况,除非SVN有更大的问题。虽然你可能需要多次运行它,因为它会从仍然有问题的根文件夹开始,然后。在这种情况下,您需要某种后序遍历,这不能用for /r完成,但可以确保您从层次结构中的最低目录开始清理。

您还需要排除SVN的状态目录.svn:

for /r /d %i in (*) do if NOT %i==.svn svn cleanup %i

对于订单后遍历,您可以构建一个小批量:

@echo off
call :recurse "."
goto :eof

:recurse
pushd %1
if not %~1==.svn (
    for /d %%i in (*) do call :recurse "%%i"
    echo svn cleanup %~1
)
popd
goto :eof

在以下树上:

a
├───.svn
├───a1
│   └───.svn
└───a2
    └───.svn
b
├───.svn
├───b1
│   ├───.svn
│   ├───b11
│   │   └───.svn
│   └───b12
│       └───.svn
└───b2

这会产生以下输出:

svn cleanup "a1"
svn cleanup "a2"
svn cleanup "a"
svn cleanup "b11"
svn cleanup "b12"
svn cleanup "b1"
svn cleanup "b2"
svn cleanup "b"
svn cleanup "."

,正如您所看到的,确保首先处理最低目录并跳过.svn目录。如果要使用它,请删除echo。这可以解决您的问题。也许

答案 2 :(得分:1)

svn cleanup会自动递归到子目录中。我不确定为什么你需要手动递归该特定命令。

答案 3 :(得分:1)

another answer中所述,for /R command有帮助:

for /D /R %I in ("*") do @echo "%~I"

要明确指定根目录,请执行以下操作:

for /D /R "D:\Root" %I in ("*") do @echo "%~I"

dir commandfor /F可以达到相同的目的:

for /F "delims=" %I in ('dir /S /B /A:D "D:\Root\*"') do @echo "%~I"

此命令行以及上述命令行从上至下遍历目录树。要扭转这种情况,只需合并sort command

for /F "delims=" %I in ('dir /S /B /A:D "D:\Root\*" ^| sort /R') do @echo "%~I"

以上所有内容均不包含根目录。要包含它,请使用以下代码:

for /F "delims=" %J in ('^(for /R "D:\Root" %I in ^(.^) do @echo "%~fI"^)') do @echo "%~J"

要再次从下到上颠倒顺序,请使用以下命令:

for /F "delims=" %J in ('^(for /R "D:\Root" %I in ^(.^) do @echo "%~fI"^^^& rem/^) ^| sort /R') do @echo "%~J"