递归遍历一个Visual Studio解决方案使用PowerShell(Recursively tr

2019-08-31 20:04发布

我需要以编程从含有在几乎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 链接 , 8E2F1269-185E-43C7-8899-950AD2769CCF 。 我可以打印出Count财产,似乎有效,但我没有看到的界面,哪儿能找到所包含元素的保持上的任何财产。 因此,也许这就是为什么我不能遍历? 不可能? 我看到的Visual Basic例子在MSDN网页我联系的底部,但我需要一个工作PowerShell的解决方案。

该函数的第一次调用似乎工作确定,例如,它看到$prjnode.Kind财产,但第一个递归调用的东西丢失了。

Answer 1:

既然你已经装载DTE,退房http://studioshell.codeplex.com/

该功能可以帮助您将最:

  • 管理你的项目,引用,断点,堆栈帧当地人,菜单,工具栏,Visual Studio中的设置,IDE窗口,甚至你的代码PowerShell脚本,都在一致和发现的方式。


Answer 2:

这里是你如何能得到与StudioShell所有加载项目

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

请注意,它可能需要长达15分钟大的解决方案。



文章来源: Recursively traversing a Visual Studio Solution using PowerShell