ほぼ 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-950AD2769CCF
Count
関数の最初の呼び出しは正常に機能しているように見えます。たとえば、$prjnode.Kind
プロパティが表示されますが、最初の再帰呼び出しの後は失われます。