使用PowerShell读取XML创建SSRS订阅遇类型转换错误如何解决
问题根因
报错的核心原因是你从XML中读取到的DeliverySettings、Values都是XML节点对象,属于2005版本SSRS导出的序列化结构,和SQL 2019的ReportService2010代理所需的强类型不兼容,无法直接作为参数传入接口。另外你当前的代码把CreateSubscription调用放在了foreach循环之外,仅能处理最后一个订阅,也需要调整。
解决方法
手动解析XML节点内容,构造SQL 2019 SSRS代理对应的强类型参数,再调用创建接口,修改后的代码如下:
# 读取XML文件 [XML]$userfile = Get-Content "E:\Test_File.xml" $Subscriptions = $userfile.Objs.Obj.MS # 连接2019 SSRS服务获取代理 $ReportServerUri = 'http://vsql2019test/reportserver' $Proxy = New-RSWebServiceProxy -ReportServerUri $ReportServerUri # 获取2019 SSRS代理的命名空间,用于构造强类型对象 $rsNamespace = $Proxy.GetType().Namespace foreach ($sub in $Subscriptions ) { # 读取基础字符串参数 $Report_Path = ($sub.S | Where-Object {$_.N -EQ 'Path'}).'#text' $Description = ($sub.S | Where-Object {$_.N -EQ 'Description'}).'#text' $EventType = ($sub.S | Where-Object {$_.N -EQ 'EventType'}).'#text' $MatchData = ($sub.S | Where-Object {$_.N -EQ 'MatchData'}).'#text' # 构造DeliverySettings强类型对象 $DeliveryNode = $sub.Obj | Where-Object {$_.N -EQ 'DeliverySettings'} $DeliverySettings = New-Object "$rsNamespace.ExtensionSettings" $DeliverySettings.Extension = ($DeliveryNode.Props.S | Where-Object {$_.N -eq 'Extension'}).'#text' # 构造传递参数数组 $deliveryParams = @() foreach ($pNode in $DeliveryNode.Props.Obj.LST.Obj) { $param = New-Object "$rsNamespace.ParameterValue" $param.Name = ($pNode.Props.S | Where-Object {$_.N -eq 'Name'}).'#text' $param.Value = ($pNode.Props.S | Where-Object {$_.N -eq 'Value'}).'#text' $deliveryParams += $param } # 补充导出时缺失的共享路径密码 $passParam = New-Object "$rsNamespace.ParameterValue" $passParam.Name = 'PASSWORD' $passParam.Value = '你的文件共享访问密码' # 统一密码可以直接写,不同密码可以做映射表匹配 $deliveryParams += $passParam $DeliverySettings.ParameterValues = $deliveryParams # 构造报表参数Values强类型数组 $ValuesNode = $sub.Obj | Where-Object {$_.N -EQ 'Values'} $reportParams = @() foreach ($rpNode in $ValuesNode.LST.Obj) { $rp = New-Object "$rsNamespace.ParameterValue" $rp.Name = ($rpNode.Props.S | Where-Object {$_.N -eq 'Name'}).'#text' $rp.Value = ($rpNode.Props.S | Where-Object {$_.N -eq 'Value'}).'#text' $reportParams += $rp } # 调用接口创建订阅 $Proxy.CreateSubscription($Report_Path, $DeliverySettings, $Description, $EventType, $MatchData, $reportParams) Write-Host "订阅创建成功:$Description" }
注意事项
- 若SQL 2019上的报表路径、共享路径、账号信息和2005不一致,可在循环中批量替换对应参数取值
- 如果是数据驱动订阅,需要调整构造参数的逻辑,匹配对应的数据驱动订阅接口
内容的提问来源于stack exchange,提问作者Gemini
相关产品推荐
相关产品推荐

