2011-07-11 40 views
1

几天前,我们收到了来自供应商针对其中一个业务应用程序的此“新”COM对象dll(为什么不是.NET)。由于缺乏文档(没有关于如何将COM对象集成到现有系统的示例或说明),我们一直在努力将其集成到我们现有的基础架构中。Powershell - 将COM对象类型转换为字符串

这里我试图使用Powershell来访问COM对象类中名为'API'的方法,并读取它返回的结果。该方法用于根据我们想要执行的操作调用各种AP​​I。任何给定API的参数都以对象数组的形式传入。返回的值存储在名为colGeneric的自定义类型中,该类型本质上是一个包含键/值对的数组(具有自定义类型clsGeneric)。在这种情况下,它会返回两个对 - pb_result和pb_resulttext。

$comClass = new-object -comObject VendorCOM.VendorClass 
$APIName = "SomeAPI" 
$ArrayOfParamsNeededByAPI = 12345, "ABC", "2011-08-01" 

$resultSet = $comClass.API([REF] $APIName, [REF] $ArrayOfParamsNeededByAPI) 

$resultText = $resultSet.Item([ref] "pb_resulttext") 

当我尝试打印$ clsGenObjResultText时,它显示为System .__ ComObject。我知道这是一个字符串,但尝试转换为字符串失败迄今。这是我尝试过的一件事:

[System.Convert]::ToString($resultText) 

它不起作用,因为它仍然返回System .__ ComObject。不知道我在这里是否有意义,但我只需要字符串形式的结果文本。

UPDATE多亏了勤政为民这个网站上,正确解决了上述问题,以取代最后一条语句中的代码片段:

$resultText = $resultSet.Item([ref] "pb_resulttext").Value 

回答

3

对我来说,你似乎试图通过该调用获取COM对象项目。可能是因为你只需要使用COM来获取该房产,你试过$resultText = $resultSet.pb_resulttext

否则,我会用好ol'e Get-Member$resultSet(也许$resultText

+1

$ resultText = $ resultSet.pb_resulttext返回任何不幸。但是,在$ resultText(get-member -inputobject $ resultText)上使用get-member给了我一个Com对象所有属性的列表,其中一个叫做设置。嗯,我想..有趣..所以我开始用$ resultText = $ resultSet.Item([ref]“pb_resulttext”)替换代码片段中的最后一个语句。值 而写主机显示预期的字符串值!!!!谢谢! – deutschZuid

+0

很高兴能够帮助:) 只是出于好奇,'$ resultSet | Get-Member'返回? –

+0

与get-member -inputobject相同$ resultSet TypeName:System。__ComObject#{'prod_id'} Name MemberType定义 ---- ---------- ---------- DataType属性string DataType(){get} {set} 字段属性字段字段(){get} {set} ParamType属性字符串ParamType(){get} {set} Value属性Variant Value(){get} {set} {set by ref} – deutschZuid

0

你可能需要知道结果对象的接口来获得你想要的值。尝试使用Windows SDK中的OleView.exe来浏览库的接口,包括colGenericclsGeneric的接口。这应该给你关于Item()实际返回的类型的关键信息。