New-SSRSReport.ps1

function New-SSRSReport (
    $Proxy,
    [string]$RdlPath
)
{
    $script:ErrorActionPreference = 'Stop'

    [xml]$Definition = Get-Content -Path $RdlPath
    $NsMgr = New-XmlNamespaceManager $Definition d

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

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

    $DescProp = New-Object -TypeName SSRS.ReportingService2010.Property
    $DescProp.Name = 'Description'
    $DescProp.Value = ''
    $HiddenProp = New-Object -TypeName SSRS.ReportingService2010.Property
    $HiddenProp.Name = 'Hidden'
    $HiddenProp.Value = 'false'
    $Properties = @($DescProp, $HiddenProp)

    $Xpath = 'd:Report/d:Description'
    $DescriptionNode = $Definition.SelectSingleNode($Xpath, $NsMgr)

    if($DescriptionNode)
    {
        $DescProp.Value = $DescriptionNode.Value
    }

    if($Name.StartsWith('_'))
    {
        $HiddenProp.Value = 'true'
    }

    Write-Verbose "Creating report $Name"
    $warnings = $null
    $Results = $Proxy.CreateCatalogItem("Report", $Name, $Folder, $true, $RawDefinition, $Properties, [ref]$warnings)

    $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.ReportingService2010.DataSourceReference
            $Reference.Reference = $DataSourcePath
            $DataSource = New-Object -TypeName SSRS.ReportingService2010.DataSource
            $DataSource.Item = $Reference
            $DataSource.Name = $_.Name
            $DataSource
        }
    if ($DataSources) {
        $Proxy.SetItemDataSources($Folder + '/' + $Name, $DataSources)
    }

    $Xpath = 'd:Report/d:DataSets/d:DataSet/d:SharedDataSet/d:SharedDataSetReference/../..'
    $References = $Definition.SelectNodes($Xpath, $NsMgr) |
        ForEach-Object {
            $DataSetPath = $DataSetPaths[$_.SharedDataSet.SharedDataSetReference]
            if ($DataSetPath) {
                $Reference = New-Object -TypeName SSRS.ReportingService2010.ItemReference
                $Reference.Reference = $DataSetPath
                $Reference.Name = $_.Name
                $Reference
            }
        }
    if ($References) {
        $Proxy.SetItemReferences($Folder + '/' + $Name, $References)
    }
}