Почему массив перестает сохранять при возникновении ошибки? - PullRequest
0 голосов
/ 23 апреля 2020

Я работал над следующим кодом, который предположительно извлекает все отчеты powerbi с сервера, проверяет, есть ли у них планы refre sh, если они этого не делают, выдает «Нет refre sh pans существует ..», и если он есть, он выводит информацию плана обновления, например, описание.

$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++;
}

У меня странная ошибка. поэтому у меня есть 2 сервера / порталы, на одном из серверов / порталов, когда я запускаю этот скрипт, он извлекает все отчеты и делает именно то, что я ожидаю, что он делает, как описано выше. Когда я подумал, что закончил разработку сценария, я протестировал его на производственном портале / сервере, и он не работал должным образом! я отлаживал в течение многих часов, пока не понял, что происходит, но не знаю, что с этим делать:

В основном, причина, по которой он работал на одном сервере / портале, а не на другом, заключается в том, что непроизводственный портал / сервер не было этой ошибки:

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

очевидно, до того, как эта ошибка произошла на производственном сервере / портале, где произошла ошибка, эта строка write-host "$($refreshPlanArray[$loopCount])", которую я добавил для целей отладки, печатала следующие odata context с до произошла ошибка!

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

затем, когда ошибка возникла после итерации 4, она перестала печатать оддаты!

почему это так?

o

1 Ответ

0 голосов
/ 23 апреля 2020

Я понял это!

$loopCount виновник! он должен быть внутри try или «хорошей» части кода, в противном случае индексация массива будет испорчена значением NULL 404

Это правильный код:

$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 {

    }
}
...