2

ほぼ 150 のプロジェクトを含むソリューションからプログラムで情報を抽出する必要があります。ただし、ソリューション ファイルはフラットではないため、一部のプロジェクトはフォルダーに編成され、フォルダー階層はより深いレベルになる可能性があります。これは再帰的な解決策に適合します。リストを列挙する関数を作成できます。要素がプロジェクトの場合はそれを調べ、フォルダーの場合はフォルダーに入り、それ自体を再帰的に呼び出してフォルダーの内容を調べます。その要点:

$dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("visualstudio.dte.11.0")

function traverseproject {
    param([object]$prjnode, [int]$level)
    if ($prjnode.Kind -eq "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}")
    {
        Write $prjnode.Name
        Write $level
    }
    if ($prjnode.Kind -eq "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}")
    {
        foreach ($prjsubnode in $prjnode)
        {
            traverseproject($prjsubnode, $level + 1)
        }
    }
}

foreach($prjn in $dte.solution.projects)
{
    traverseproject($prjn, 0)
}

問題は、再帰関数が取得する $prjnode オブジェクトがおかしいことです。 Write $prjnode.Name何も出力しません。おそらく同じ理由で、フォルダー オブジェクトのノードを反復処理できません。現在、上記のコードではforeach ($prjsubnode in $prjnode)、それは黙って何もしません。試してみforeach ($prjsubnode in $prjnode.ProjectItems)ましたが、エラーが発生します。ありとあらゆる組み合わせを試しました。

エラー メッセージから、 はリンク$prjnodeタイプであると思われます。プロパティを出力でき、有効に見えますが、含まれている要素を取得できるインターフェイスにプロパティが表示されません。だから多分それが私が反復できない理由ですか?方法はありません?リンクした MSDN ページの下部に Visual Basic の例が表示されていますが、有効な PowerShell ソリューションが必要です。DTE ProjectItem 8E2F1269-185E-43C7-8899-950AD2769CCFCount

関数の最初の呼び出しは正常に機能しているように見えます。たとえば、$prjnode.Kindプロパティが表示されますが、最初の再帰呼び出しの後は失われます。

4

2 に答える 2

2

すでに dte を読み込んでいるので、http: //studioshell.codeplex.com/ をチェックしてください。

最も役立つ機能:

  • プロジェクト、参照、ブレークポイント、スタック フレーム ローカル、メニュー、ツールバー、Visual Studio 設定、IDE ウィンドウ、さらには PowerShell スクリプトからのコードまで、すべて一貫性のある見つけやすい方法で管理します。
于 2013-07-14T18:00:40.797 に答える
0

StudioShell で読み込まれたすべてのプロジェクトを取得する方法は次のとおりです。

$projects = ls -path "DTE:\solution\Projects" -recurse
  | where {$_.FileName -match ".csproj"}

大きなソリューションの場合、最大 15 分かかる場合があることに注意してください。

于 2013-09-02T20:07:29.453 に答える