2012-01-26 11 views
1

すべての作業コピーを1.6 svnから1.7にアップグレードするpowershellスクリプトを書いておきたいと思います。 問題は、指定されたサブディレクトリ内のすべての作業コピーを検索し、それぞれの最初の一致で停止することです。このスクリプトは、作業コピーにネストサブディレクトリを含めすべての.svnディレクトリを見つけることができる:すべてのsvn作業コピーを見つけるPowerShellスクリプト

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

は、ディレクトリ内の最初の試合でGet-ChildItemコマンドレットを停止し、再帰サブディレクトリ処理を中止する任意のオプションがありますか?見るべきヒント?

もう1つのオプションは、出力結果を取得して、親\子ディレクトリ関係に基づいてロジックを使用してリストを並べ替えることです。もう少し混乱する方法ですが、それもオプションです...

答えて

4

私は、このようなパイプラインのための適切なフィルタリング条件を発見しました。

これはregexの後方参照と似ており、パイプラインフィルタの内部で予想どおりに動作します。

+0

こんにちは私は同じ要望を持っています。「すべてのsvnの作業コピーをどのように見つけてXPに勝つのか」を尋ねていましたが、重複を避けるために、私はちょうど答えをbashスクリプトに貼り付けて実行できますか? –

+0

いいえ、JW、残念ながらこのコードをbashスクリプトに貼り付けることはできません。cmd \ batchは動作しません。これを実行するにはpowershellが必要です。幸いにもwinxpのpowershell 2.0があります(例:http://j.mp/Hbr88yを確認してください)。 マシンに何かをインストールする際に問題が残っている場合は、bashと同じスクリプトを見つけることができます) - bashは非常に強力で、そのようなスクリプトは簡単に作成できます。cmd(デフォルトではWinXPに同梱) - 私はそれに多くの経験を持っていませんが、cmdスクリプトはとても短くてシンプルになるだろうという疑問がありますパワーシェル1として。WB R –

+0

私はこのコメントを追加して以来、私はWin XP上に[cnet.comからWindows XP用Microsoft Windows PowerShell 1.0](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

ええと、あなたのスクリプトは1つの作業コピー(ディレクトリの最初のもの)しか見つけられなくなり、breakがヒットします。 if-conditionが適切に変更されるか、またはいくつかの追加の検査で破損する必要があります。努力をいただきありがとうございます。私はそれを掲示した後にもう少しの研究で適切な答えを見つけました。 PS:回答をアップアップしますが、質問回答として受け入れることはできません。 –

+0

@AlexeyShcherbak私はあなたの質問の解釈に問題があったと思います。コード例に基づいて最初のヒットで処理を停止し、「ディレクトリで最初に一致し、サブディレクトリの処理をやり直す」という要件に従うようにしたようです。 –

+0

紛らわしい質問のために残念=( –

関連する問題