2012-01-26 31 views
1

我想编写powershell脚本将所有工作副本从1.6 svn升级到1.7。 问题在于找到指定子目录中的所有工作副本,并在每个副本的首次匹配时停止。该脚本可以找到所有 .svn目录包含子目录,嵌套在工作副本:Powershell脚本查找所有svn工作副本

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

是否有任何选项停止获取,ChildItem上的第一场比赛在目录中,递归停止子目录处理?任何提示看看?

另一种方法是获取输出结果,并根据父\子目录关系用一些逻辑对列表进行排序\筛选。有点混乱的方式,即时通讯,但它也是一种选择...

回答

4

我发现这样的管道适当的过滤条件。

$prev = "^$" 

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

它与正则表达式反向引用类似,并且在流水线过滤器中按预期工作。

+0

你好我有同样的需要,我正要问“如何找到所有svn工作副本在win xp上”,但为了避免重复,你可以扩展这个答案。一个powershell,我可以将代码粘贴到一个bash脚本中并运行它吗? –

+0

不,你不能粘贴这段代码到bash脚本中,cmd \ batch都不能用,你需要powershell来执行它。幸运的是有winxp的powershell 2.0可用(例如检查http://j.mp/Hbr88y) 如果你在你的机器上安装东西时仍然有问题 - 你可以尝试为bash找到相同的脚本(如你所提到的) - bash是相当强大的,这样的脚本可以很容易使用它。至于cmd(默认情况下在WinXP上发布) - 我没有太多的经验,但有一些疑问,cmd脚本将如此简短和简单作为PowerShell的一员R –

+0

由于我添加了该评论,因此我在Win XP上安装了[来自cnet.com的Microsoft Windows PowerShell 1.0 for Windows XP](http://www.cnet.com/)。然后我在C:\上试用了你的脚本,并且得到了一个错误:Get-ChildItem:拒绝访问路径'C:\ System Volume Information'。'在我意识到脚本继续运行,尽管出现了这个错误之后,我通过添加'-ErrorAction SilentlyContinue'来找到一个[修复](http://www.computerperformance.co.uk/powershell/powershell_erroraction_silentlycontinue.htm)。无论哪种方式,你给的脚本在Win XP上的PowerShell 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 
    } 
} 
+0

嗯,你的脚本只能找到一个工作副本(目录中的第一个副本),然后中断会被击中。我认为如果条件可以适当修改,或者应该进行一些额外的检查。感谢您的努力。发布之后,我找到了适当的答案和更多的研究。 PS:我upvote你的答案,但不能接受它作为问题的答案。 –

+0

@AlexeyShcherbak我想我很难解释你的问题。看起来你希望根据你的代码示例停止处理第一个命中,并遵循要求获得“目录中的第一个匹配,并停止递归子处理”。 –

+0

对不起,令人困惑的问题=( –