我需要以编程方式从包含近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
类型为DTE
ProjectItem
link,8E2F1269-185E-43C7-8899-950AD2769CCF
。我可以打印出Count
属性,它似乎有效,但我没有在界面上看到任何可以获取所包含元素的属性。也许那就是为什么我不能迭代?不可能?我在链接的MSDN页面底部看到了Visual Basic示例,但我需要一个有效的PowerShell解决方案。
函数的第一次调用似乎工作正常,例如它看到了$prjnode.Kind
属性,但是在第一次递归调用之后,事情就丢失了。
答案 0 :(得分:2)
由于您已加载dte,请查看http://studioshell.codeplex.com/
最能帮助您的功能:
答案 1 :(得分:0)
以下是使用StudioShell
获取所有已加载项目的方法$projects = ls -path "DTE:\solution\Projects" -recurse
| where {$_.FileName -match ".csproj"}
请注意,大型解决方案最多可能需要15分钟。