从Powershell调用具有签名(SAFEARRAY(Variant))的COM方法

从Powershell调用具有签名(SAFEARRAY(Variant))的COM方法,powershell,com,Powershell,Com,我有一个COM对象,其中包含一个我想从Powershell创建和调用的方法 我从源代码中知道,方法签名是: private DataSet MethodName(string connectionString, int userID, string location, int specID) 在Powershell中创建对象时: $obj = New-Object -ComObject My.ComObjectClass $obj | Get-Member 签名看起来像: MethodNam

我有一个COM对象,其中包含一个我想从Powershell创建和调用的方法

我从源代码中知道,方法签名是:

private DataSet MethodName(string connectionString, int userID, string location, int specID)
在Powershell中创建对象时:

$obj = New-Object -ComObject My.ComObjectClass
$obj | Get-Member
签名看起来像:

MethodName               Method     _Recordset_Deprecated MethodName (SAFEARRAY(Variant))   
因此,我创建了一个数组并将其传递给方法:

$MyArgs = "data source=Server;Initial catalog=kickassDB",1234,"flavortown",56
$obj.MethodName([ref]$MyArgs)
但这不起作用。我得到一个错误:

Exception calling "MethodName" with "1" argument(s): "Type mismatch"
我想我的问题是我的数组充满了规则字符串和整数值,我需要创建变量,但我不知道如何在Powershell中实现这一点


有什么想法吗?

我知道这是一篇很老的帖子,但我只是更新了一下,因为我遇到了类似的情况,发现了这个帖子。如果其他人偶然发现了这一点,他们可能会发现我的解决方案很有帮助

我在尝试使用PowerShell v7下的HTMLFile COM对象的写入方法时收到以下错误。这不是PowerShell v5的问题。对于PS5,该方法需要System.Object[]参数。对于PS7,它需要一个SAFEARRAY(Variant)参数

“类型不匹配。(0x80020005(显示类型不匹配))”

我能够使用jedigo的解决方案解决我的问题,并提供字节数组而不是字符串。因此,最终起作用的代码类似于:

$H = New-Object -ComObject "HTMLFile"
$S = '<p>Some Text</p>'
$B = [System.Text.Encoding]::Unicode.GetBytes($S)
$H.write($B)
$H=新对象-com对象“HTMLFile”
$S='一些文本

' $B=[System.Text.Encoding]::Unicode.GetBytes($S) $H.write($B)
使用此语法创建$MyArgs,默认情况下会创建一个变体数组!如果忽略签名以及powershell的显示方式会怎么样。如果您只调用$Obj.MethodeName(“数据源=服务器;初始目录=kickassDB”,1234,“flavortown”,56”),该怎么办?@xMRi尝试过了。不起作用。问题主体中的例外文本几乎是我得到的全部。使用“1”参数调用“MethodName”时出现异常:U:\testScript.ps1:4 char:15+$obj.MethodName处的“类型不匹配”