使用PowerShell递归遍历Visual Studio解决方案

Recursively traversing a Visual Studio Solution using PowerShell

我需要以编程方式从包含近150个项目的解决方案中提取信息。解决方案文件不是很平坦,因此某些项目被组织到文件夹中,文件夹层次结构可以更深入。
这适合递归解决方案:我可以编写一个枚举列表的函数,如果元素是项目,则它将对其进行检查;如果它是文件夹,则它将进入该文件夹并递归调用自身以检查该文件夹的内容。要点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$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),这给出了错误。我尝试了任何一种组合。

从错误消息看来,$prjnodeDTE ProjectItem链接8E2F1269-185E-43C7-8899-950AD2769CCF的类型。我可以打印出Count属性,它似乎是有效的,但是我在接口上看不到任何可以保留所包含元素的属性。因此,也许这就是为什么我无法遍历?不可能?我在链接的MSDN页面的底部看到了Visual Basic示例,但是我需要一个有效的PowerShell解决方案。

该函数的第一次调用似乎可以正常工作,例如,它看到了$prjnode.Kind属性,但是在第一次递归调用之后,一切都丢失了。


由于您已经在加载dte,请访问http://studioshell.codeplex.com/

为您提供最大帮助的功能:

  • 以一致且可发现的方式管理项目,引用,断点,堆栈局部变量,菜单,工具栏,Visual Studio设置,IDE窗口,甚至可以从PowerShell脚本管理代码。


这是使用StudioShell获取所有已加载项目的方法

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

请注意,大型解决方案最多可能需要15分钟。