为什么我在一个环境中的 SSRS Powershell 脚本中看到这些错误,而在另一个环境中却看不到?
Why Am I Seeing These Errors in My SSRS Powershell Script in One Environment but Not Another?
我有一个 Powershell 脚本,我正在为 post-迁移 SSRS 报告管理任务工作。
在这个特定场景中,我们有一个 DEV 环境(我主要在其中进行测试)托管单个 SSRS 实例,以及一个 Prod 环境,它是跨 4 个节点的横向扩展部署。
我是 Powershell 的新手(2 天前才发现它...)我的脚本非常简单:
Clear-Host
$Username = "domain\myUsername"
$Password = "myPassword"
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($Username,(ConvertTo-SecureString -String $Password -AsPlainText -Force))
# Dev Connection String
$webServiceUrl = 'http://DEVwebServer.domain.com/reportserver/reportservice2010.asmx?WSDL'
# Prod Connection String
# $webServiceUrl = 'http://PRODwebServerNode1.domain.com/reportserver/reportservice2010.asmx?WSDL'
$rs = New-WebServiceProxy -Uri $webServiceUrl -Credential $Cred
$reports = $rs.ListChildren("/Some Folder Under Root", $true) | Where-Object { $_.TypeName -eq "Report" }
$type = $ssrsProxy.GetType().Namespace;
$schedDefType = "{0}.ScheduleDefinition" -f $type;
$schedDef = New-Object ($schedDefType)
$warning = @();
foreach ($report in $reports) {
$sched = $rs.GetExecutionOptions($report.Path, [ref]$schedDef);
$snapShotExists = $rs.ListItemHistory($report.Path);
if($sched -eq "Snapshot") {
Write-Host "Following report is configured to run from Snapshot:" -ForegroundColor Yellow
Write-Host ("Report Name: {0}`nReport Path: {1}`nExecution Type: {2}`n" -f $report.Name, $report.Path, $sched)
if ($snapShotExists) {
Write-Host "Does Snapshot Exist..?`n" -ForegroundColor Yellow
Write-Host "Yes!`tNumber of Snapshots: " $snapShotExists.Count -ForegroundColor Green
$snapShotExists.CreationDate
Write-Host "`n------------------------------------------------------------"
}
elseif (!$snapShotExists) {
Write-Host "Does Snapshot Exist..?`n" -ForegroundColor Yellow
Write-Host ("No!`n") -ForegroundColor Red
Write-Host "Creating Snapshot.......`n" -ForegroundColor Yellow
$rs.CreateItemHistorySnapshot($report.Path, [ref]$warning);
Write-Host "Snapshot Created!`n" -ForegroundColor Green
$snapShotExists.CreationDate
Write-Host "`n------------------------------------------------------------"
}
}
}
脚本的目的只是简单地递归迭代$reports变量中给定文件夹的所有报告,检查执行类型是否设置为"Snapshot",如果是检查查看 "History Snapshot" 是否存在,如果不存在,则创建一个。
当我在 Dev 中 运行 时,它工作得很好,但是当我在 PROD 中 运行 时,我的 foreach 循环中的每个 $report 重复以下错误:
关于为什么这会在一个而不是另一个中起作用以及如何克服这个错误有什么想法吗?
通过使用 this answer 作为指南进行一些调整,我能够在 Prod 实例上运行它:
通过更新我对 New-WebServiceProxy 的调用以添加 Class 和命名空间标志,我能够通过以下方式更新脚本:
...
# Add Class and Namespace flags to New-WebServiceProxy call
$rs = New-WebServiceProxy -Class 'RS' -Namespace 'RS' -Uri $webServiceUrl -Credential $Cred
$reports = $rs.ListChildren("/Business and Technology Solutions", $true) | Where-Object { $_.TypeName -eq "Report" }
# Declare new "ScheduleDefintion object using the Class declared in the New-WebServiceProxy call
$schedDef = New-Object RS.ScheduleDefinition
$warning = @();
foreach ($report in $reports) {
# Referencing the "Item" property from the ScheduleDefinition
$execType = $rs.GetExecutionOptions($report.Path, [ref]$schedDef.Item)
...
我不认为在 New-WebServiceProxy 调用中添加 Class 和命名空间标志正是它的作用,因为我认为这只是一种更简洁的方式来确保您获得正确的来自 WebService 的命名空间。也许只是一点点糖。
我认为关键的变化是确保来自计划定义对象的 "Item" 属性,尽管我不确定为什么它在 Dev 中工作而不这样做...
我有一个 Powershell 脚本,我正在为 post-迁移 SSRS 报告管理任务工作。
在这个特定场景中,我们有一个 DEV 环境(我主要在其中进行测试)托管单个 SSRS 实例,以及一个 Prod 环境,它是跨 4 个节点的横向扩展部署。
我是 Powershell 的新手(2 天前才发现它...)我的脚本非常简单:
Clear-Host
$Username = "domain\myUsername"
$Password = "myPassword"
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($Username,(ConvertTo-SecureString -String $Password -AsPlainText -Force))
# Dev Connection String
$webServiceUrl = 'http://DEVwebServer.domain.com/reportserver/reportservice2010.asmx?WSDL'
# Prod Connection String
# $webServiceUrl = 'http://PRODwebServerNode1.domain.com/reportserver/reportservice2010.asmx?WSDL'
$rs = New-WebServiceProxy -Uri $webServiceUrl -Credential $Cred
$reports = $rs.ListChildren("/Some Folder Under Root", $true) | Where-Object { $_.TypeName -eq "Report" }
$type = $ssrsProxy.GetType().Namespace;
$schedDefType = "{0}.ScheduleDefinition" -f $type;
$schedDef = New-Object ($schedDefType)
$warning = @();
foreach ($report in $reports) {
$sched = $rs.GetExecutionOptions($report.Path, [ref]$schedDef);
$snapShotExists = $rs.ListItemHistory($report.Path);
if($sched -eq "Snapshot") {
Write-Host "Following report is configured to run from Snapshot:" -ForegroundColor Yellow
Write-Host ("Report Name: {0}`nReport Path: {1}`nExecution Type: {2}`n" -f $report.Name, $report.Path, $sched)
if ($snapShotExists) {
Write-Host "Does Snapshot Exist..?`n" -ForegroundColor Yellow
Write-Host "Yes!`tNumber of Snapshots: " $snapShotExists.Count -ForegroundColor Green
$snapShotExists.CreationDate
Write-Host "`n------------------------------------------------------------"
}
elseif (!$snapShotExists) {
Write-Host "Does Snapshot Exist..?`n" -ForegroundColor Yellow
Write-Host ("No!`n") -ForegroundColor Red
Write-Host "Creating Snapshot.......`n" -ForegroundColor Yellow
$rs.CreateItemHistorySnapshot($report.Path, [ref]$warning);
Write-Host "Snapshot Created!`n" -ForegroundColor Green
$snapShotExists.CreationDate
Write-Host "`n------------------------------------------------------------"
}
}
}
脚本的目的只是简单地递归迭代$reports变量中给定文件夹的所有报告,检查执行类型是否设置为"Snapshot",如果是检查查看 "History Snapshot" 是否存在,如果不存在,则创建一个。
当我在 Dev 中 运行 时,它工作得很好,但是当我在 PROD 中 运行 时,我的 foreach 循环中的每个 $report 重复以下错误:
关于为什么这会在一个而不是另一个中起作用以及如何克服这个错误有什么想法吗?
通过使用 this answer 作为指南进行一些调整,我能够在 Prod 实例上运行它:
通过更新我对 New-WebServiceProxy 的调用以添加 Class 和命名空间标志,我能够通过以下方式更新脚本:
...
# Add Class and Namespace flags to New-WebServiceProxy call
$rs = New-WebServiceProxy -Class 'RS' -Namespace 'RS' -Uri $webServiceUrl -Credential $Cred
$reports = $rs.ListChildren("/Business and Technology Solutions", $true) | Where-Object { $_.TypeName -eq "Report" }
# Declare new "ScheduleDefintion object using the Class declared in the New-WebServiceProxy call
$schedDef = New-Object RS.ScheduleDefinition
$warning = @();
foreach ($report in $reports) {
# Referencing the "Item" property from the ScheduleDefinition
$execType = $rs.GetExecutionOptions($report.Path, [ref]$schedDef.Item)
...
我不认为在 New-WebServiceProxy 调用中添加 Class 和命名空间标志正是它的作用,因为我认为这只是一种更简洁的方式来确保您获得正确的来自 WebService 的命名空间。也许只是一点点糖。
我认为关键的变化是确保来自计划定义对象的 "Item" 属性,尽管我不确定为什么它在 Dev 中工作而不这样做...