Search code examples
powershell-5.0

Why does the array stop storing when an error happens?


I have been working on the following code that supposedly retrieves all powerbi reports from the server, checks if they have refresh plans, if they dont, it outputs "No refresh pans exist..", and if it does have it, then it outputs refreshplan info like description.

$webPortalURL = "https://server-pbi.domain.com/reports"

$PBI_Reports_Array = @()
$PBI_Reports_Array = $(Invoke-RestMethod -UseDefaultCredentials -uri $($webPortalURL + "/api/v2.0/PowerBIReports"))

$loopCount = 0 
$refreshPlanArray = @()

foreach ($reportPath in $PBI_Reports_Array.value.path) {

        $refreshPlanArray += $(Invoke-RestMethod -UseDefaultCredentials -uri $($webPortalURL + "/api/v2.0/PowerBIReports(path='" + $reportPath + "')/CacheRefreshPlans")); 

        write-host "$($refreshPlanArray[$loopCount])" -foregroundcolor magenta; #testing output here to debug

        if ([string]::IsNullOrEmpty($($refreshPlanArray[$loopCount].value))) { 
            write-host "$loopCount | $reportPath | No Refresh Plan Exists for this report!"; 
        }
        else {
            write-host "$loopCount | $reportPath | $($refreshPlanArray[$loopCount].value.Description) | $($refreshPlanArray[$loopCount].value.ScheduleDescription)" -foregroundcolor magenta;
        }

    $loopCount++;
}

i am running into a weird bug. so i have 2 servers/portals, on one of the servers/portals, when i run this script, it retrieves all reports and does exactly what i am expecting it do as described above. when i thought i finished developing the script, i tested it on production portal/server and it wasnt working as expected! i debugged for many hours until i think i found whats happening, but idk what to do about it:

basically, the reason why it worked on one server/portal but not the other is because the nonproduction portal/server didnt have this error:

Invoke-RestMethod : The remote server returned an error: (404) Not Found.

apparently, before that error happened on the production server/portal where this failed, this line write-host "$($refreshPlanArray[$loopCount])" i added for debugging purposes was printing the following odata contexts up until the error happened!

@{@odata.context=https://server-pbi.domain.com/reports/api/v2.0/$metadata#CacheRefreshPlans; value=System.Object[]}

then when the error occurred after iteration 4, it stopped printing the odata!

why is that?

o


Solution

  • I figured it out!

    $loopCount is the culprit! it has to be inside a try, or the "good" part of the code, otherwise, the array indexing gets messed up with the 404 NULL value

    This is the correct code:

    $webPortalURL = "https://server-pbi.domain.com/reports"
    
    $PBI_Reports_Array = @()
    $PBI_Reports_Array = $(Invoke-RestMethod -UseDefaultCredentials -uri $($webPortalURL + "/api/v2.0/PowerBIReports"))
    
    $loopCount = 0 
    $refreshPlanArray = @()
    
    foreach ($reportPath in $PBI_Reports_Array.value.path) {
        try {
            $refreshPlanArray += $(Invoke-RestMethod -UseDefaultCredentials -uri $($webPortalURL + "/api/v2.0/PowerBIReports(path='" + $reportPath + "')/CacheRefreshPlans"));
    
            if ([string]::IsNullOrEmpty($($refreshPlanArray[$loopCount].value))) { 
                write-host "$loopCount | $reportPath | No Refresh Plan Exists for this report!"; 
            }
            else {
                write-host "$loopCount | $reportPath | $($refreshPlanArray[$loopCount].value.Description) | $($refreshPlanArray[$loopCount].value.ScheduleDescription)" -foregroundcolor magenta;
            }
    
            $loopCount++;
        }
        catch {
    
        }
    }