Le script ci-dessous prend en paramètre un fichier contenant une liste de dashboard a exporter au format pbix.
#####################################################################
###### PwBI_Export_Dashboards.ps1 - EXPORT DE RAPPORTS EN PBIX ######
#####################################################################
<#
.SYNOPSIS
CONNEXION A L'API SQL POWERBI REPORTING SERVICES ET EXPORT DE UN OU PLUSIEURS DASHBOARD
.PARAMETER
webServiceUrl : Url Racine du serveur de rapport
CatalogUrl : Url du catalogue des items
DashboardListFile : Fichier des noms de dashboard a exporter
BackupFolder : Dossier d'export des dashboards
LogFolder : Chemin du dossier où creer le log du script
.EXAMPLE
.\PwBI_Export_Dashboards.ps1 -webServiceUrl "http://MyServer/Reports" -DashboardListFile ".\PwBI_Export_Dashboards_List.txt" -BackupFolder ".\BACKUP" -LogFolder ".\BACKUP"
#>
[CmdletBinding()]
param(
[Parameter(Mandatory,HelpMessage="Url Racine du serveur de rapport")]
[string]$webServiceUrl,
[Parameter(Mandatory=$false,HelpMessage="Url du catalogue des items")]
[string]$CatalogUrl = "$webServiceUrl/api/v2.0/CatalogItems",
[Parameter(Mandatory,
HelpMessage="Fichier des noms de dashboard a exporter")]
[ValidateScript({
if( -Not ($_ | Test-Path) ){
throw "File does not exist"
}
return $true
})]
[string]$DashboardListFile,
[Parameter(Mandatory,HelpMessage="Dossier d'export des dashboards")]
[string]$BackupFolder,
[Parameter(Mandatory,HelpMessage="Chemin du dossier où creer le log du script")]
[string]$LogFolder = "D:\Indicateurs_Securité"
)
# GET DASHBOARD LIST CONTENT
[array]$DashboardList = Get-Content -Path $DashboardListFile
# SCRIPT NAME
$ScriptName = "PwBI_Export_Dashboards.ps1"
# LogName = ScriptName without extension
$Log = $ScriptName.Split('.')[0]
# GET CREDENTIALS TO CONNECT TO REPORT SERVER
$cred = $(Get-Credential -Credential "$env:USERDOMAIN\$env:USERNAME")
function Write-Log
{
<#
.SYNOPSIS
This function creates or appends a line to a log file.
.PARAMETER Message
The message parameter is the log message you'd like to record to the log file.
.EXAMPLE
PS C:\> Write-Log -Message 'Value1'
This example shows how to call the Write-Log function with named parameters.
#>
[CmdletBinding()]
param (
[Parameter(Mandatory)]
[string]$Message,
[Parameter(Mandatory)]
[string]$LogPath,
[Parameter(Mandatory)]
[string]$LogName
)
try
{
$DateTime = Get-Date -Format ‘MM-dd-yy HH:mm:ss’
Add-Content -Value "$DateTime - $Message" -Path "$LogPath\$LogName.log"
}
catch
{
Write-Error $_.Exception.Message
}
}
# TABLEAU DES CATALOG ITEMS
$Message = "Recuperation du catalogue des items..."
write-host $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log
try
{
$CatalogItems = Invoke-RestMethod -Uri $CatalogUrl -ContentType 'application/json' -UseDefaultCredentials -Method get
}
catch
{
$Message = "Error during query of Catalog Items"
Write-Log -Message "$Message - $($Error[0].Exception)" -LogPath $LogFolder -LogName $Log
Write-Host -F Yellow $Message
exit 1
}
# COMPARAISON DE $CatalogItems ET $ReportList POUR DETERMINER LA LISTE DES DASHBOARDS A EXPORTER
$FoundReport = $CatalogItems.value | Where-Object {$_.name -in $DashboardList}
if (!($FoundReport))
{
$Message = "The required Dashboards have not been found in the catalog of the report server - END OF SCRIPT"
write-host -f Yellow $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log
Exit 1
}
# EXPORT DES DASHBOARDS
try
{
foreach ($Report in $FoundReport)
{
$url = "$CatalogUrl($($Report.Id))/Content/`$value"
Invoke-WebRequest -UseDefaultCredentials -Uri $url -OutFile "$BackupFolder\$($Report.name).pbix"
}
}
catch
{
$Message = "KO - The required Dashboards have not been found in the catalog of the report server - END OF SCRIPT"
write-host -f Yellow $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log
Exit 1
}
$Message = "OK - The required Dashboards have been Exported to $BackupFolder - END OF SCRIPT"
write-host -f Green $Message
Write-Log -Message $Message -LogPath $LogFolder -LogName $Log
Exit 0