use*_*859 5 powershell quickbooks
我有一个第三方应用程序,到目前为止使用插件与quickbooks交谈.该插件不再适用于最新版本的Windows操作系统,因此我将使用PowerShell脚本替换它.插件将实现QBXMLRP.RequestProcessor com对象,然后打开连接并开始与QuickBooks的会话,处理来自我的应用程序的各种请求,然后关闭并断开与quickbooks的连接.连接打开时,QuickBooks提供的票证用于处理来自我的应用程序的任意数量的请求.
使用PowerShell,我执行命令行提示以"PowerShell"启动PowerShell,并运行PowerShell .ps1脚本文件.正如插件所做的那样,PS脚本实例化com对象,打开qb连接,开始qb会话,发送qb请求,结束qb会话,关闭qb连接.
这很好用,除了与插件不同,我在使用QuickBooks的单个打开会话期间无法从我的应用程序发送多个请求.一旦我发出命令行提示符,PS脚本会执行此操作并且PS退出并且com对象丢失.无论如何,它们是保留qb com对象的实时实例并在后续PowerShell会话中重用它...
我的应用程序发出命令行提示符以运行开始qb会话的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 ??
Run Code Online (Sandbox Code Playgroud)
我的应用程序发出命令行调用打开PS Session 2发送请求到qb ...
(.ps1 script)
$myqbxmrlp = ?? get the live com object back ??
$ticket = Import-CliXml $ticket (or get-content)
$myqbxmrlp.ProcessRequest($ticket,....)
Run Code Online (Sandbox Code Playgroud)
用另一个请求打开PS Session 3的命令行调用...
用另一个请求打开PS Session 4的命令行调用...
命令行调用打开PS Session 5并结束qb会话并关闭qb连接...
(.ps1 script)
$myqbxmrlp = ?? get the com object back ??
$ticket = Import-CliXml $ticket (or get-content)
myqbxmrlp.EndSession($ticket,....)
$myqbxmrlp.CloseConnection
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以使用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
Run Code Online (Sandbox Code Playgroud)
相关问题:如何从 PowerShell 连接到现有的 Excel 实例?
更新#1:
如何使 Marshal.GetActiveObject 可用。我收到以下错误...使用“1”个参数调用“GetActiveObject”时出现异常:“操作不可用(来自 HRESULT 的异常:0x800401E3 (MK_E_UNAVAILABLE))”
这可能意味着第 3 方应用程序未注册为自动化服务器。无法获取对正在运行的实例的引用。。您可以尝试使用regsvr32.exeQBXMLRP.RequestProcessor注册公开的文件(可能是 dll\tlb\ocx\exe),但鉴于我对 QuickBooks 的零知识,我无法给您任何具体说明。尝试在 QuickBooks 安装目录中搜索包含 string 的文件。RequestProcessor
更新:#2
虽然您似乎无法获取 QuickBooks 对象的实时实例,但这可以通过进程间通信 (IPC) 来缓解:
IPC 可以通过命名管道完成,以下是一些示例:
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |