Powershell «не может индексировать в нулевой массив» ошибка возникает только внутри функции - PullRequest
0 голосов
/ 31 октября 2019

У меня ошибка ниже, когда я пытаюсь запустить функцию, которую я создаю для суммирования трафика. Странно то, что когда я запускаю этот код сам по себе (без вызова функции), он работает нормально.

Я заметил, что проблема при вызове функции заключается в том, что я пытаюсь использовать индекс (пример: $ _[1])

Cannot index into a null array.
At line:13 char:79
+         $sumhumanvisits = ($humanvisits[0..($humanvisits.Length)] | foreach { $_ ...
+                                                                               ~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Cannot index into a null array.
At line:16 char:73
+         $sumbotvisits = ($botvisits[0..($botvisits.Length)] | foreach { $_[1]} | ...
+                                                                         ~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Код такой

function Get-incapTraffic-90Days ($site_id,$id,$key){

        #Incapsula visits in last 90 days
        $r2 = Invoke-WebRequest ("https://my.incapsula.com/api/stats/v1?api_id=" + $id + "&api_key=" + $key + "&time_range=last_90_days&site_id=" + $site_id + "&stats=visits_timeseries") -Method Post
        $visits = $r2.Content | ConvertFrom-Json

        $humanvisits = @(($visits.visits_timeseries | Where-Object {$_.id -match "api.stats.visits_timeseries.human"} | Select-Object data).data)
        #$humanvisits = $visits.visits_timeseries[0].data
        $botvisits = @(($visits.visits_timeseries | Where-Object {$_.id -match "api.stats.visits_timeseries.bot"} | Select-Object data).data)
        #$botvisits = $visits.visits_timeseries[1].data

        #Summarize Human visits
        $sumhumanvisits = ($humanvisits[0..($humanvisits.Length)] | foreach { $_[1]} | measure -Sum).Sum

        #Summarize Bot visits
        $sumbotvisits = ($botvisits[0..($botvisits.Length)] | foreach { $_[1]} | measure -Sum).Sum


        if (($sumhumanvisits -gt 0) -and ($sumbotvisits -gt 0)){

            $traffic = $sumhumanvisits.ToString() + " Human + " + $sumbotvisits + " Bots Traffic"
        }
        elseif($sumhumanvisits -gt 0){

            $traffic = ($sumhumanvisits.ToString() + " Human traffic")

        }
        elseif($sumbotvisits -gt 0){

            $traffic = ($sumbotvisits.ToString() + " Bot traffic")
        }
        else{

            $traffic = "No traffic"
        }
        Return $traffic
}

Ниже приведено хранилище данных для переменной $ humanvisits. И мне нужно только суммировать небольшие значения.

1564531200000
69
1571788800000
145
1565049600000
229
1569196800000
249
1569456000000
156
1568419200000
114
1567641600000
165

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Я обнаружил проблему.

Я передавал параметры в функции, разделенные запятой (ошибка noob), извините за это.

функция передавала индекс Cannot в пустой массивошибка, потому что поиск не возвращал значения в качестве параметров, где неправильно.

0 голосов
/ 31 октября 2019

Я думаю, что вы получите эту ошибку, потому что вы используете оператор регулярного выражения -match, но вы не избегаете точек в строке для сравнения.

Попробуйте:

$reHuman = [regex]::Escape("api.stats.visits_timeseries.human")
$reBot   = [regex]::Escape("api.stats.visits_timeseries.bot")
$humanvisits = @(($visits.visits_timeseries | Where-Object {$_.id -match $reHuman} | Select-Object data).data)
$botvisits = @(($visits.visits_timeseries | Where-Object {$_.id -match $reBot} | Select-Object data).data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...