powershell - 是否可以在 PowerShell session 之间传递 com 对象的实时实例

标签 powershell quickbooks

我有一个 3rd 方应用程序,到目前为止,它使用插件与 quickbooks 对话。该插件不再适用于最新版本的 Windows 操作系统,因此我将使用 PowerShell 脚本替换它。该插件将实例化 QBXMLRP.RequestProcessor com 对象,然后打开一个连接并开始与 QuickBooks 的 session ,处理来自我的应用程序的各种请求,然后关闭并断开与 QuickBooks 的连接。当连接打开时,QuickBooks 提供的票用于处理来自我的应用程序的任意数量的请求。

使用 PowerShell,我执行命令行提示以“启动”PowerShell,并运行 PowerShell .ps1 脚本文件。正如插件所做的那样,PS 脚本实例化 com 对象,打开 qb 连接,开始 qb session ,发送 qb 请求,结束 qb session ,关闭 qb 连接。

这工作正常,除了与插件不同,我无法在与 QuickBooks 的单个打开 session 期间从我的应用程序发送多个请求。一旦我发出命令行提示,PS 脚本就会执行它的操作并且 PS 退出并且 com 对象丢失。他们无论如何要保留 qb com 对象的实时实例并在随后的 PowerShell session 中重用它...

我的应用程序发出命令行提示以运行开始 qb session 的 PowerShell...

(.ps1 script)    
$myqbxmrlp = New-Object -com QBXMLRP.RequestProcessor
$myqbxmrlp.OpenConnection(...)
$ticket = $myqbxmrlp.BeginSession(....) 
$ticket | Export-CliXml $ticket (or set-content)
?? preserve the live $myqbxmrlp com object ??

我的应用程序使用命令行调用打开 PS Session 2 向 qb 发送请求...
(.ps1 script)    
$myqbxmrlp = ?? get the live com object back ??
$ticket = Import-CliXml $ticket (or get-content)
$myqbxmrlp.ProcessRequest($ticket,....)      

使用另一个请求打开 PS session 3 的命令行调用...

使用另一个请求打开 PS Session 4 的命令行调用...

命令行调用打开 PS Session 5 并结束 qb session 并关闭 qb 连接...
(.ps1 script)    
$myqbxmrlp = ?? get the com object back ??
$ticket = Import-CliXml $ticket (or get-content)
myqbxmrlp.EndSession($ticket,....)
$myqbxmrlp.CloseConnection

有没有另一种方法可以使用 powershell 来解决这个问题?

最佳答案

我无法验证这是否适用于 QuickBooks,但适用于 Excel 和其他 COM 对象。您必须使用 Marshal.GetActiveObject方法:

# Name of the QuickBooks COM object
$QbComObject = 'QBXMLRP.RequestProcessor'

# Try to get active instance of the QuickBooks COM object
if(-not ($myqbxmrlp = [Runtime.InteropServices.Marshal]::GetActiveObject($QbComObject)))
{
    # If we can't, then create new instance
    $myqbxmrlp = New-Object -ComObject $QbComObject
    $myqbxmrlp.OpenConnection(<#...your code...#>)
}

# Some code to process tickets...
$ticket = $myqbxmrlp.BeginSession(<#...your code...#>) 
$ticket | Export-CliXml $ticket

真实问题:How to connect to existing instance of Excel from PowerShell?

更新 #1:

How do I make Marshal.GetActiveObject available. I am getting the following error...Exception calling "GetActiveObject" with "1" argument(s): "Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))"



可能这意味着 the 3rd party app is not registered as an automation server. It is not possible to get a reference to the running instance. .您可以尝试注册暴露 QBXMLRP.RequestProcessor 的文件(它可能是 dll\tlb\ocx\exe)与 regsvr32.exe ,但鉴于我对 QuickBooks 的零知识,我无法给您任何具体的说明。尝试在 QuickBooks 安装目录中搜索包含字符串 RequestProcessor 的文件.

更新:#2

虽然您似乎无法获得 QuickBooks 对象的实时实例,但这可以通过进程间通信 (IPC) 来缓解:
  • 一个脚本应该创建一个 QuickBooks 对象,然后等待输入
  • 所有 QuickBooks 交互都是通过对另一个脚本的后续调用完成的,该脚本只会通过 IPC 将请求传递给第一个脚本。

  • IPC 可以通过命名管道完成,以下是一些示例:
  • Interprocess Communication in Powershell
  • Windows PowerShell and Named Pipes
  • 关于powershell - 是否可以在 PowerShell session 之间传递 com 对象的实时实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29735611/

    相关文章:

    bash - 在 powershell 中等待命令输出中的文本

    json - PowerShell ConvertFrom-Json 未将 JSON 列表转换为 Json 对象

    xml - 编辑xml文件后如何保留重音符号?

    php - 如何使用 consolibyte API 删除 Quickbook 中的客户?

    quickbooks - 代码 - 3140,消息 - 发票中存在对 QuickBooks 项目销售税 "GST"的无效引用

    powershell - 为什么新 AD 用户不复制组成员身份?

    powershell - Import-DscResource 找不到包 cChoco

    quickbooks - 将 QBSDK 中的 Entires 关联到 IPP?

    java - 是否可以设置 QuickBooks Online 访问 token 过期或生命周期

    mysql - 一个 Rails 网络应用程序、quickbooks 和 mysql