2012-01-26 33 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

對不起,令人困惑的問題=( –