【发布时间】:2020-07-25 11:28:07
【问题描述】:
我有一个关于 Windows PowerShell 在处理 Com Interop 时如何工作的问题。
我有一个第 3 方应用程序(我们称之为 ThirdPartyApp),它公开了一个我可以调用的 API。
我可以提前绑定它,例如Excel 或 Visual Studio 并“直接”与其交谈。我可以在 VBScript 中后期绑定它,并且仍然“直接”与它对话。
“直接”是指我可以使用 ThirdPartyApp.Name 之类的语法调用 API 公开的属性和方法的方式
所以在 VBScript 中我可以做到:
Dim api : Set api = CreateObject("ThirdPartyApp.API")
WScript.Echo api.Name
在 PowerShell 中,当我这样做时:
$api = New-Object -ComObject ThirdPartyApp.API
我必须使用这种语法来获取名称:
[System.__ComObject].InvokeMember('Name',[System.Reflection.BindingFlags]::GetProperty,$null,$api,$null)
现在,我知道这与 ThirdPartyApp 的构建方式有关。
我知道这不是编码问题,我希望我不会立即被否决,但我的问题是:为什么我不能在使用 Powershell 时以 VBScript 方式与这个程序集对话? Powershell 中的New-Object -ComObject 与VBScript 中的CreateObject(identifier) 有何不同?
【问题讨论】:
-
请更新问题以澄清您使用的是 Windows PowerShell 还是 PowerShell [Core]。
-
完成。这是关于 Windows Powershell 的。它是关于 COM 的,那只是 Windows 的,对吧?不过没关系。
-
感谢您的澄清。 PowerShell [Core] 也在 Windows 上运行,并且在某些领域缺乏它的 COM 支持,因此我的问题。根据标签“powershell”的指导,将暗示 Windows PowerShell - 对于 PowerShell [Core] 问题建议使用“powershell-core”,但我怀疑随着 PowerShell [Core] 的接管,这条线将越来越模糊。
标签: powershell vbscript