W ramach dzisiejszego wpisu powiemy sobie jak w prosty sposób wyeksportować na dysk wszystkie raporty opublikowane na powerbi.com za pomocą skryptu Powershell. Zapraszam do lektury!
Może się zdarzyć sytuacja, że będziemy chcieli wyeksportować raport lub raporty z powerbi.com. O tym jak to zrobić raczej nie trzeba mówić, wystarczy zalogować się do serwisu i tam w odpowiednim workspace znaleźć upragniony raport, otworzyć go i wybrać opcję eksportu dostępną z głównego menu:
Co jednak w przypadku gdy raportów jest dużo? Nie pozostaje nam nic innego jak uzbroić się w cierpliwość, trochę kawy i klikać jeden po drugim. Jednakże nie jest to jedyna możliwość! Możemy również zatrudnić naszego starego przyjaciela jakim jest Powershell i wykorzystać dostępne cmdlety – zbudujmy taki skrypt razem.
W pierwszym kroku zdefiniujemy sobie ścieżkę gdzie będziemy chcieli zachować nasze wyeksportowane raporty. W moim przypadku będzie to dedykowany folder na moim pulpicie:
$reportPath = "C:\Users\adria\Desktop" $myReportsLocation="$($reportPath)\PBI_Reports"
Obie ścieżki zachowałem w zmiennej aby móc później się do nich odwołać. Oczywiście folder na raporty może nie istnieć więc ja przy każdym wywołaniu skryptu będę go usuwał i tworzył na nowo za pomocą odpowiedniego wywołania sekwencji komend Set-Location Remove-Item oraz New-Item:
Set-Location $reportPath Remove-Item $myReportsLocation -Recurse -ErrorAction Ignore New-Item -ItemType "Directory" -Name "PBI_Reports" -Force Set-Location $MyReportsLocation
Warto zwrócić uwagę, że przy Remove-Item usuwamy rekursywnie wszystkie podfoldery i pliki znajdujące się w folderze więc warto być ostrożnym. Opcja -ErrorAction Ignore została dodana aby zignorować możliwe błędy np. gdy folder nie istnieje (akceptowalny w moim przypadku skrót:)). Na końcu przechodzimy do stworzonego przez nas folderu za pomocą Set-Location.
Gdy mamy już gotowe miejsce gdzie będziemy eksportować raporty musimy zalogować się do Power BI. Do tego musimy mieć zainstalowany moduł PowerBI, jeśli go nie macie nalezy go zainstalować komendą Install-Module:
Install-Module -Name MicrosoftPowerBIMgmt
Następnie logujemy się do serwisu komendą:
Login-PowerBIServiceAccount
Komenda ta spowoduje pojawienie się okna logowania gdzie musimy podać nasze dane uwierzytelniające. Oczywiście jeśli nasz skrypt nie byłby skryptem wykonywanym na żądanie moglibyśmy zarejestrować aplikację i logować się automatycznie ale na ten moment sobie to podarujemy.
Przechodzimy do działania na serwisie powerbi.com. Jak już wspomniałem naszym celem jest eksport wszystkich raportów ze wszystkich workspace’ów dlatego wylistujmy je sobie komendą Get-PowerBIWorkspace:
$Workspaces = Get-PowerBIWorkspace | Select-Object -Property Id,Name
Komenda ta oczywiście dosyć dużo informacji o Workspace’ach ale my jedyne co potrzebujemy to jedynie identyfikator i nazwa dlatego też tylko te właściwości pobrałem przy pomocy komendy Select-Object. Całość zapisałem w zmiennej o nazwie Workspaces do późniejszego użycia.
W kolejnym kroku będziemy iterowali po każdym workspace, a zrobimy to prostą pętelką foreach:
foreach ($Workspace in $Workspaces) {
Raporty o tych samych nazwach mogą się powtarzać pomiędzy Workspace dlatego też zrobimy sobie w naszej lokalizacji foldery o takiej nazwie jak Workspace’y. Tak więc na poniższym kawałku skryptu widzimy następujące czynności:
- wyświetlamy bieżący workspace
- tworzymy folder z taką nazwą jak bieżący workspace
- tworzymy zmienną z pełną ścieżką do folderu dla bieżącego workspace
- przechodzimy do wyżej wymienionego folderu
Write-Host "Workspace: "+ $Workspace New-Item -ItemType "Directory" -Name $Workspace.Name -Force $CurrentFolder = $MyReportsLocation +"\"+$Workspace.Name Set-Location $CurrentFolder
Pamiętamy, że jesteśmy w pętli iterującej po workspace’ach więc przechodząc dalej powinniśmy przejść po wszystkich raportach. Tak więc musimy zapisać sobie listę raportów po której będziemy się poruszać, a zrobimy to za pomocą Get-PowerBIReport i podobnie jak w poprzednim przypadku pobieramy jedynie Id oraz nazwę:
$ReportsToExport=Get-PowerBIReport -WorkspaceId $Workspace.Id |Select-Object -Property Id,Name
Pętla eksportująca przedstawia się następująco:
foreach($report in $ReportsToExport) { $ReportExportName =$report.Name+".pbix" if( $report.Name -like "*Usage Metrics Report*") { Write-Host "Skipped" $report } else { Write-Host "Try to export " $ReportExportName Export-PowerBIReport -Id $report.Id -OutFile $ReportExportName -WorkspaceId $Workspace.Id Write-Host $report.Name+".pbix exported" } }
zmienna $ReportExportName przechowuje nazwę bieżącego raportu i dodajmy do tego rozszerzenie pbix. Dodałem dodatkowo sprawdzenie za pomocą funkcji warunkowej, aby ignorować wszystkie raporty, które zawierają statystyki użycia, których wyeksportować nie możemy (jeśli mamy inne warunki do spradzenia nic nie stoi na przeszkodzie aby je tutaj umieścić). Sam eksport to wywołanie kolejnej komendy, a mianowicie Export-PowerBIReport.
Cały skrypt przedstawia się w następujący sposób:
$reportPath = "C:\Users\adria\Desktop" $myReportsLocation="$($reportPath)\PBI_Reports" Set-Location $reportPath Remove-Item $myReportsLocation -Recurse -ErrorAction Ignore New-Item -ItemType "Directory" -Name "PBI_Reports" -Force $MyReportsLocation Set-Location $MyReportsLocation Login-PowerBIServiceAccount $Workspaces = Get-PowerBIWorkspace | Select-Object -Property Id,Name foreach ($Workspace in $Workspaces) { Write-Host "Workspace: "+ $Workspace New-Item -ItemType "Directory" -Name $Workspace.Name -Force $CurrentFolder = $MyReportsLocation +"\"+$Workspace.Name Set-Location $CurrentFolder $ReportsToExport=Get-PowerBIReport -WorkspaceId $Workspace.Id |Select-Object -Property Id,Name foreach($report in $ReportsToExport) { $ReportExportName =$report.Name+".pbix" if( $report.Name -like "*Usage Metrics Report*") { Write-Host "Skipped" $report } else { Write-Host "Try to export " $ReportExportName Export-PowerBIReport -Id $report.Id -OutFile $ReportExportName -WorkspaceId $Workspace.Id Write-Host $report.Name+".pbix exported" } } Set-Location $MyReportsLocation }
Oczywiście nie zadziała on w każdym możliwym przypadku bo niektórych raportów po prostu nie da się eksportować (np. te z włączonym Incremental Load) ale w wielu przypadkach sprawdzi się on bez problemu. Po uruchomieniu wszystkie pbix znalazły się na moim dysku w odpowiednich folderach:
Myślę, że możliwości użycia Powershell w Power BI są całkiem spore i z tego miejsca zachęcam do zapoznania się z poszczególnymi cmdletami których nie jest tak dużo – dokumentację znajdziecie tutaj. Mam nadzieję, że ten krótki artykuł przypadł Wam do gustu, a ze swojej strony mogę powiedzieć, że jeszcze z całą pewnością wrócimy na blogu do użycia Powershell w PowerBI. Pozdrawiam.
- Avoiding Issues: Monitoring Query Pushdowns in Databricks Federated Queries - October 27, 2024
- Microsoft Fabric: Using Workspace Identity for Authentication - September 25, 2024
- Executing SQL queries from Azure DevOps using Service Connection credentials - August 28, 2024
Where is the “like” button on this post? Good work. It’s nice to see how using PowerShell, we can do so many more things.