【问题标题】:Recursively traversing a Visual Studio Solution using PowerShell使用 PowerShell 递归遍历 Visual Studio 解决方案
【发布时间】:2013-04-22 21:23:27
【问题描述】:

我需要以编程方式从包含近 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),这给出了错误。我尝试了任何一种组合。

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

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

【问题讨论】:

  • 现在我递归地枚举 csproj 文件并解析它们,使用 PowerShell($proj = [xml](get-content $csproj$proj.GetElementsByTagName("Reference")...)非常容易,但它获得了 288 个 csproj 而不是真正的 ~150 个。因此,遍历真实的实时层次结构而不是 XML 解析会非常棒。
  • 使用 $prjnode.GetType()$prjnode | Get-Member 获取有关该对象的更多信息。
  • @AnsgarWiechers 我会尝试,Get-Members 是有道理的。这可能是答案,我会告诉你的。

标签: visual-studio powershell recursion envdte


【解决方案1】:

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

对您帮助最大的功能:

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

【讨论】:

  • 感谢您的提示。尽管我现在离这个问题还很远,但我会检查一下。
【解决方案2】:

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

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

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

【讨论】:

  • 找不到驱动器。名为“DTE”的驱动器不存在。
猜你喜欢
  • 2021-01-30
  • 2015-11-28
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多