【问题标题】:Difference observed b/w NuGet Package Manager Console and plain PowerShell console观察到黑白 NuGet 包管理器控制台和普通 PowerShell 控制台的差异
【发布时间】:2015-06-21 20:02:24
【问题描述】:

在 Visual Studio 中的 NuGet 包管理器控制台(我使用的是 2010 Ultimate)中,以下代码有效并成功激活了工具箱窗口:

$dte.windows.Item("{B1E99781-AB81-11D0-B683-00AA00A3EE26}").activate()

但相同的代码在独立的 PowerShell 控制台会话中不起作用。这是我正在使用的脚本:

# Note: Start PowerShell console with the -STA switch.

# Get reference to VS2010 automation object (COM).
$DTE = New-Object -ComObject VisualStudio.DTE.10.0

$DTE.Solution.Open("C:\wfa1\wfa1.sln")

$DTE.MainWindow | %{$_.gettype().InvokeMember("Visible","SetProperty",$null,$_,$true)}

$DTE.Windows.Item("{B1E99781-AB81-11D0-B683-00AA00A3EE26}").Activate()

$DTE.Quit() 

我得到的错误:

方法调用失败,因为 [System.__ComObject] 不包含 一个名为“项目”的方法。
在 C:\users\ams\Desktop\ATS\AddTypeSample.ps1:114 char:18
+ $DTE.Windows.Item + CategoryInfo : InvalidOperation: (Item:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

我知道 NuGet 准备了它的控制台,例如,$dte 变量可以立即使用,而无需执行任何操作。如何设置我的 PS 脚本,以便命令能够像在 NuGet 控制台中一样无缝运行?

我在 Windows 7 Ultimate 上使用 PowerShell 版本 2。

【问题讨论】:

  • (注:完全不熟悉 NuGet。)在这两种情况下,$dte.Windows 是什么?
  • @EtanReisner NuGet 控制台中$dte.Windows 的输出是一系列以AutoHides 开头并以OutstandingEventCount 结尾的重复属性;在 PowerShell 控制台中,输出为 System.__ComObject 重复九次。
  • $dte.windows[0].gettype() 怎么样? (我假设它是重复的数组。)
  • @EtanReisner 在 PowerShell 控制台中:无法索引到 System.__ComObject 类型的对象。在 NuGet 中:无法索引到 Microsoft.VisualStudio.Platform.WindowManagement.DTE.Windows 类型的对象。
  • 不完全是我期望找到的类型,但这似乎给了我想要的东西。我不知道如何处理这些信息,但问题似乎是 powershell 没有在 windows 对象上使用/设置正确的类型。您可以尝试手动投射,但我认为这不太可能奏效。熟悉 NuGet 的人可能可以在这里说更多,但我认为我的深度太远了,无法提供更多帮助。

标签: powershell com nuget envdte


【解决方案1】:

我认为您尝试做的事情是不可能的。在 Visual Studio 的包管理器控制台中时,您的 PowerShell 脚本在一个完全不同的主机中运行,该主机提供对 Visual Studio 环境的访问。这就是 $dte 变量的来源。当您在纯 PowerShell 控制台窗口中运行脚本时,您使用的是不了解 Visual Studio 的默认 PowerShell 主机。

查看 MSDN 上的 Writing a Windows PowerShell Host Application,了解有关 Windows PowerShell 主机的更多详细信息。您可以使用 Get-Host cmdlet 检查您的脚本在哪个主机上运行。

【讨论】:

  • 我明白了,您是说包管理器控制台提供的魔力无法在普通控制台中轻松复制。
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2015-10-10
  • 2013-01-03
相关资源
最近更新 更多