如何用PowerShell在现有BizTalk应用中创建接收位置与发送端口
如何在现有BizTalk应用中用PowerShell创建接收位置和发送端口
我明白你的问题了——你已经能写出创建接收端口、发送端口的PowerShell代码,但不知道怎么把这些资源关联到已有的BizTalk应用上(而不是新建一个应用)。核心问题是:默认通过$catalog.AddNewReceivePort()或$catalog.AddNewSendPort()创建的端口是不属于任何应用的,你需要先获取目标现有应用的对象,再把创建的端口添加到这个应用里。下面是具体的解决方案和修正后的完整代码:
步骤1:获取现有BizTalk应用
在主脚本连接到Catalog之后,直接通过应用名称获取已有的应用对象;如果不确定名称,可以遍历所有应用确认:
# 替换成你的现有BizTalk应用名称 $targetApp = $Catalog.Applications["你的现有应用名称"] # 可选:遍历所有应用查看名称 # foreach ($app in $Catalog.Applications) { Write-Host "可用应用:$($app.Name)" }
步骤2:修改函数,将端口关联到目标应用
你需要调整两个核心函数,让它们接收目标应用作为参数,并且把创建的端口添加到应用中。同时我会修正原代码里的几个小问题:变量作用域错误、接收管道查找逻辑、过滤器XML拼接问题。
完整修改后的代码
#===Create a receive port and location function===# Function CreateRPandRL ($catalog, $targetApp) { # 创建接收端口 $myReceivePort = $catalog.AddNewReceivePort($false) $myReceivePort.Name = "My Receive Port" # 关键:将接收端口添加到目标现有应用 $targetApp.AddReceivePort($myReceivePort) # 创建接收位置 $myReceiveLocation = $myReceivePort.AddNewReceiveLocation() foreach ($handler in $catalog.ReceiveHandlers) { if ($handler.TransportType.Name -eq "FILE") { $myReceiveLocation.ReceiveHandler = $handler break } } # 配置传输协议和文件路径 $myReceiveLocation.TransportType = $catalog.ProtocolTypes["FILE"] $myReceiveLocation.Address = @" C:\BizTalk\Receive\Pickup "@ # 替换成你的实际接收路径 # 查找并分配接收管道(修正原代码的查找逻辑) foreach ($pipeline in $catalog.Pipelines) { if ($pipeline.DisplayName -eq "Microsoft.BizTalk.DefaultPipelines.FileReceive") { $myReceiveLocation.ReceivePipeline = $pipeline break } } # 启用接收位置(移出循环,修复原代码的逻辑错误) $myReceiveLocation.Enable = $true # 提交更改,失败则回滚 try { $catalog.SaveChanges() Write-Host "接收端口和位置创建成功并关联到目标应用" } catch { $catalog.DiscardChanges() throw "创建接收端口失败: $_" } # 返回创建好的接收端口,供发送端口过滤器使用 return $myReceivePort } Function CreateSendPorts($catalog, $targetApp, $linkedReceivePort) { # 异常处理:发生错误则回滚更改 $ErrorActionPreference="Stop" trap { Write-Host "Exception encountered:`r`n$_`r`nDiscarding Changes.`r`n" $catalog.DiscardChanges() exit } # 创建单向静态发送端口 $mySendPort = $catalog.AddNewSendPort($false,$false) $mySendPort.Name = "My Send Port" # 关键:将发送端口添加到目标现有应用 $targetApp.AddSendPort($mySendPort) $mySendPort.PrimaryTransport.TransportType = $catalog.ProtocolTypes["FILE"] $mySendPort.PrimaryTransport.Address = @" C:\BizTalk\Send\Dropoff "@ # 替换成你的实际发送路径 $mySendPort.SendPipeline = $catalog.Pipelines["Microsoft.BizTalk.DefaultPipelines.EdiSend"] # 保存发送端口 Write-Host "Adding $($mySendPort.Name)..." $catalog.SaveChanges(); Write-Host "`r`n$($mySendPort.Name) has been created." # 配置基于内容的路由过滤器(修正XML拼接逻辑) Write-Host "$($mySendPort.Name): Adding a filter" $filterXml = @" <Filter> <Group> <Statement Property='EDI.ISA06' Operator='0' Value='9999999999'/> <Statement Property='EDI.ST01' Operator='0' Value='999'/> <Statement Property='EDI.IsSystemGeneratedAck' Operator='0' Value='true'/> <Statement Property='BTS.ReceivePortName' Operator='0' Value='$($linkedReceivePort.Name)'/> </Group> </Filter> "@ $mySendPort.Filter = $filterXml.Replace("`n","").Replace("`r","") # 移除换行避免XML格式问题 # 保存过滤器设置 Write-Host "$($mySendPort.Name): Saving changes" $catalog.SaveChanges(); Write-Host "`r`nFilters for $($mySendPort.Name) created" # 启动发送端口 $mySendPort.Status = [Microsoft.BizTalk.ExplorerOM.PortStatus]::Started Write-Host "Changing $($mySendPort.Name) status to $($mySendPort.Status)..." $catalog.SaveChanges() Write-Host "Complete." } #===Main Script=== # 加载BizTalk ExplorerOM程序集 try { [void][System.reflection.Assembly]::LoadwithPartialName("Microsoft.BizTalk.ExplorerOM") } catch { throw "无法加载BizTalk ExplorerOM程序集: $_" } # 连接BizTalk管理数据库 $Catalog = New-Object Microsoft.BizTalk.ExplorerOM.BtsCatalogExplorer $Catalog.ConnectionString = "SERVER = YOUR_SERVER_NAME; DATABASE=BizTalkMgmtDB; Integrated Security=SSPI" # 获取目标现有应用 $targetApp = $Catalog.Applications["你的现有应用名称"] if (-not $targetApp) { throw "未找到指定的BizTalk应用,请检查应用名称是否正确" } # 执行创建逻辑 $createdReceivePort = CreateRPandRL -catalog $Catalog -targetApp $targetApp CreateSendPorts -catalog $Catalog -targetApp $targetApp -linkedReceivePort $createdReceivePort Start-Sleep -Seconds 10
关键说明
- 关联端口到应用:通过
$targetApp.AddReceivePort()和$targetApp.AddSendPort()方法,把创建的端口绑定到目标现有应用,这是解决你问题的核心。 - 变量作用域修复:让
CreateRPandRL返回创建的接收端口,再传递给CreateSendPorts,确保过滤器能正确引用接收端口名称。 - 逻辑错误修正:把接收位置的
Enable设置移出循环,修复原代码里的执行时机错误;调整管道查找逻辑,确保能匹配到正确的系统管道。 - 错误处理优化:统一异常处理逻辑,确保发生错误时能自动回滚未提交的更改。
内容的提问来源于stack exchange,提问作者user401
相关产品推荐
相关产品推荐

