You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

关键说明

  1. 关联端口到应用:通过$targetApp.AddReceivePort()和$targetApp.AddSendPort()方法,把创建的端口绑定到目标现有应用,这是解决你问题的核心。
  2. 变量作用域修复:让CreateRPandRL返回创建的接收端口,再传递给CreateSendPorts,确保过滤器能正确引用接收端口名称。
  3. 逻辑错误修正:把接收位置的Enable设置移出循环,修复原代码里的执行时机错误;调整管道查找逻辑,确保能匹配到正确的系统管道。
  4. 错误处理优化:统一异常处理逻辑,确保发生错误时能自动回滚未提交的更改。

内容的提问来源于stack exchange,提问作者user401

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:42:32