用于查找所有svn工作副本的Powershell脚本

时间:2012-01-26 08:19:28

标签: svn scripting powershell

我想编写powershell脚本来将所有工作副本从1.6 svn升级到1.7。 问题是在指定的子目录中找到所有工作副本,并在每个匹配项的第一个匹配项上停止。这个脚本可以找到所有 .svn目录,包括嵌套在工作副本中的子目录:

Get-ChildItem -Recurse -Force -Path "d:\Projects\" |?{$_.PSIsContainer -and $_.FullName -match ".svn$"}|Select-Object FullName

是否有任何选项可以在目录中的第一场比赛中停止Get-ChildItem,并停止递归子目录处理?有什么提示要看吗?

另一种选择是获取输出结果并使用一些逻辑对列表进行排序\过滤,基于父\子目录关系。有点混乱的方式,imo,但它也是一个选项...

2 个答案:

答案 0 :(得分:5)

我找到了适当的过滤条件。

$prev = "^$"

Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\" `
| ?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}`
| %{ $prev=$_.Fullname.TrimEnd(".svn"); $prev}

它与正则表达式反向引用类似,并且在管道过滤器内按预期工作。

答案 1 :(得分:1)

您可以使用break。以下是一些例子:

Get-ChildItem -Recurse -Force -Path "d:\Projects\" | ? {$_.PSIsContainer } | % {
    if ($_.FullName  -match ".svn$") {
        # 1. Process first hit
            # Code Here... 
        # 2. Then Exit the loop
            break
    }
}

或略有不同的方式:

$dirs = Get-ChildItem -Recurse -Force -Path "d:\Projects\" | ? {$_.PSIsContainer }
foreach ($dir in $dirs) {
    if ($dir.FullName  -match ".svn$") {
        # 1. Process first hit
            # Code Here... 
        # 2. Then Exit the loop
            break
    }
}