Difference between ISE vs command line and out of memory

  • I'm having a small problem. I downloaded a Powershell script that would allow me to deploy SSRS reports. The script itself works great. I modified the script so that it would copy only the reports that changed. I made the changes using the ISE and everything works great. I tried to execute the script using the command line shell because that is how it will be executed in production and it crashes with an out of memory problem. I know it is crashing when working with RDL files above 900K (I have 2 such reports). I have reconfigured Powershell as outlined in the link below, but it didn't seem to help. I believe it is crashing when comparing 2 files. Does anybody have any idea as to why it would crash using the command line and not crash using ISE? I would appreciate any input on this. I'm developing & testing this script on my local machine, but it will be placed on a server for production use.

    #To upgrade to the latest version, change '.ReportingService2005' with '.ReportingService????'

    #SqlServer 2012: '.ReportingService2010'

    #requires -version 2.0

    [CmdletBinding()]

    param (

    [parameter(Mandatory=$true)]

    [ValidatePattern('\.rptproj$')]

    [ValidateScript({ Test-Path -PathType Leaf -Path $_ })]

    [string]

    $Path,

    [parameter(

    ParameterSetName='Configuration',

    Mandatory=$true)]

    [string]

    $Configuration,

    [parameter(

    ParameterSetName='Target',

    Mandatory=$true)]

    [ValidatePattern('^https?://')]

    [string]

    $ServerUrl,

    [parameter(

    ParameterSetName='Target',

    Mandatory=$true)]

    [string]

    $Folder,

    [parameter(

    ParameterSetName='Target',

    Mandatory=$true)]

    [string]

    $DataSourceFolder,

    [parameter(ParameterSetName='Target')]

    [switch]

    $OverwriteDataSources,

    [System.Management.Automation.PSCredential]

    $Credential

    )

    function New-XmlNamespaceManager ($XmlDocument, $DefaultNamespacePrefix) {

    $NsMgr = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $Xmldocument.NameTable

    $DefaultNamespace = $Xmldocument.DocumentElement.GetAttribute('xmlns')

    if ($DefaultNamespace -and $DefaultNamespacePrefix) {

    $NsMgr.AddNamespace($DefaultNamespacePrefix, $DefaultNamespace)

    }

    return ,$NsMgr # unary comma wraps $NsMgr so it isn't unrolled

    }

    function Normalize-SSRSFolder (

    [string]$Folder

    ) {

    if (-not $Folder.StartsWith('/')) {

    $Folder = '/' + $Folder

    }

    return $Folder

    }

    function New-SSRSFolder (

    $Proxy,

    [string]

    $Name

    ) {

    Write-Verbose "New-SSRSFolder -Name $Name"

    $Name = Normalize-SSRSFolder -Folder $Name

    if ($Proxy.GetItemType($Name) -ne 'Folder') {

    $Parts = $Name -split '/'

    $Leaf = $Parts[-1]

    $Parent = $Parts[0..($Parts.Length-2)] -join '/'

    if ($Parent) {

    New-SSRSFolder -Proxy $Proxy -Name $Parent

    } else {

    $Parent = '/'

    }

    $Proxy.CreateFolder($Leaf, $Parent, $null)

    }

    }

    function New-SSRSDataSource (

    $Proxy,

    [string]$RdsPath,

    [string]$Folder,

    [switch]$Overwrite

    ) {

    Write-verbose "New-SSRSDataSource -RdsPath $RdsPath -Folder $Folder"

    $Folder = Normalize-SSRSFolder -Folder $Folder

    [xml]$Rds = Get-Content -Path $RdsPath

    $ConnProps = $Rds.RptDataSource.ConnectionProperties

    $Definition = New-Object -TypeName SSRS.ReportingService2005.DataSourceDefinition

    $Definition.ConnectString = $ConnProps.ConnectString

    $Definition.Extension = $ConnProps.Extension

    if ([Convert]::ToBoolean($ConnProps.IntegratedSecurity)) {

    $Definition.CredentialRetrieval = 'Integrated'

    }

    $DataSource = New-Object -TypeName PSObject -Property @{

    Name = $Rds.RptDataSource.Name

    Path = $Folder + '/' + $Rds.RptDataSource.Name

    }

    if ($Overwrite -or $Proxy.GetItemType($DataSource.Path) -eq 'Unknown') {

    $Proxy.CreateDataSource($DataSource.Name, $Folder, $Overwrite, $Definition, $null)

    }

    return $DataSource

    }

    $script:ErrorActionPreference = 'Stop'

    Set-StrictMode -Version Latest

    # increase the memory per shell.

    set winrm/config/winrs @{MaxMemoryPerShellMB="4096"}

    $PSScriptRoot = $MyInvocation.MyCommand.Path | Split-Path

    $Path = $Path | Convert-Path

    $ProjectRoot = $Path | Split-Path

    [xml]$Project = Get-Content -Path $Path

    if ($PSCmdlet.ParameterSetName -eq 'Configuration') {

    $Config = & $PSScriptRoot\Get-SSRSProjectConfiguration.ps1 -Path $Path -Configuration $Configuration

    $ServerUrl = $Config.ServerUrl

    $Folder = $Config.Folder

    $DataSourceFolder = $Config.DataSourceFolder

    $OverwriteDataSources = $Config.OverwriteDataSources

    }

    $Folder = Normalize-SSRSFolder -Folder $Folder

    $DataSourceFolder = Normalize-SSRSFolder -Folder $DataSourceFolder

    $Proxy = & $PSScriptRoot\New-SSRSWebServiceProxy.ps1 -Uri $ServerUrl -Credential $Credential

    New-SSRSFolder -Proxy $Proxy -Name $Folder

    New-SSRSFolder -Proxy $Proxy -Name $DataSourceFolder

    $DataSourcePaths = @{}

    $Project.SelectNodes('Project/DataSources/ProjectItem') |

    ForEach-Object {

    $RdsPath = $ProjectRoot | Join-Path -ChildPath $_.FullPath

    $DataSource = New-SSRSDataSource -Proxy $Proxy -RdsPath $RdsPath -Folder $DataSourceFolder

    $DataSourcePaths.Add($DataSource.Name, $DataSource.Path)

    }

    $Project.SelectNodes('Project/Reports/ProjectItem') |

    ForEach-Object {

    $RdlPath = $ProjectRoot | Join-Path -ChildPath $_.FullPath

    [xml] $Definition = Get-Content -Path $RdlPath

    $NsMgr = New-XmlNamespaceManager $Definition d

    $RawDefinition = Get-Content -Encoding Byte -Path $RdlPath

    $Name = $_.Name -replace '\.rdl$',''

    Write-Host "Verifying $Folder->$Name" -foreground white

    $ProxyFullPathFileName = $Folder + "/" + $Name

    # for ssrs 2005, use GetReportDefinition; 2008 use GetItemDefinition

    $destinationFile = $Proxy.GetReportDefinition($ProxyFullPathFileName) #"/ForDeliveryToClients/Appraiser Distribution For Client")

    #******************************

    # I believe this is where it is crashing

    #******************************

    if (Compare-Object -ReferenceObject $RawDefinition -DifferenceObject $destinationFile)

    {

    Write-host "Deploying report" -foreground yellow

    $Results = $Proxy.CreateReport($Name, $Folder, $true, $RawDefinition, $null)

    if ($Results -and ($Results | Where-Object { $_.Severity -eq 'Error' })) {

    throw 'Error uploading report'

    }

    $Xpath = 'd:Report/d:DataSources/d:DataSource/d:DataSourceReference/..'

    $DataSources = $Definition.SelectNodes($Xpath, $NsMgr) |

    ForEach-Object {

    $DataSourcePath = $DataSourcePaths[$_.DataSourceReference]

    if (-not $DataSourcePath) {

    throw "Invalid data source reference '$($_.DataSourceReference)' in $RdlPath"

    }

    $Reference = New-Object -TypeName SSRS.ReportingService2005.DataSourceReference

    $Reference.Reference = $DataSourcePath

    $DataSource = New-Object -TypeName SSRS.ReportingService2005.DataSource

    $DataSource.Item = $Reference

    $DataSource.Name = $_.Name

    $DataSource

    }

    if ($DataSources) {

    $Proxy.SetItemDataSources($Folder + '/' + $Name, $DataSources)

    }

    }

    }

  • If you added error handling (see here) then you could supply us with some more detail.

    Gaz

    -- Stop your grinnin' and drop your linen...they're everywhere!!!

  • Thanks. I will do that.

  • After making changes to the code, I'm not having any problems at all. Thanks for the help on the error trapping.

  • You're welcome. Glad you resolved it.

    Gaz

    -- Stop your grinnin' and drop your linen...they're everywhere!!!

  • dpoquette (10/8/2014)


    After making changes to the code, I'm not having any problems at all. Thanks for the help on the error trapping.

    Please post the changes to the code so that others might benefit. Thanks.

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)

Viewing 6 posts - 1 through 5 (of 5 total)

You must be logged in to reply to this topic. Login to reply