我想编写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,但它也是一个选项...
答案 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
}
}