«Вы не можете вызвать метод для выражения с нулевым значением» при использовании Invoke-Command - PullRequest
1 голос
/ 09 апреля 2020

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

Но как только я добавляю команду Invoke-Command в свой скрипт, она прекрасно подключается к серверу, но тогда все переменные из моих функций получают значения NULL.

I Я использую глобальные переменные, чтобы выйти из области действия моих функций, чтобы я мог взаимодействовать с ними, поскольку я не смог вернуть их другим способом.

Это часть кода, которая не работает:

$session = New-PSSession -ComputerName $Machines[$j] -Credential $credentials
Invoke-Command -Session $session -ScriptBlock {

    $OSVersions = (Get-WMIObject win32_operatingsystem -ComputerName $Machines[$j]).caption
    Network-Info -Machine $Machines[$j] -OSVersion $OSVersions -Techinfo $TechInfoNew

}
Export-Excel $FullPath -WorksheetName "Results" -StartColumn 1 -Title $Machines[$j] -TitleSize 12 -StartRow $i #fix the counter var
Export-Excel $FullPath -WorksheetName "Results" -StartColumn 2 -Title $OSVersions -TitleSize 12 -StartRow $i

foreach($result in $global:results){

    Export-Excel $FullPath -WorksheetName "Results" -StartColumn 3 -Title $global:Tech[$k] -TitleSize 12 -StartRow $i
    Export-Excel $FullPath -WorksheetName "Results" -StartColumn 4 -Title $result -TitleSize 12 -StartRow $i
    $k++
    $i++

}

Ошибки добавляются в оператор foreach.

Заранее спасибо.

1 Ответ

1 голос
/ 09 апреля 2020

Насколько я вижу, вы ожидаете, что Invoke-Command запустит одну из функций в вашем скрипте, и это можно сделать, чего нельзя сделать, если только блок скриптов в Invoke-Command увидит переменные, которые вы определили в своем скрипте, вам также нужно изменить функцию, чтобы она возвращала значения вместо изменения глобальных переменных.

Попробуйте это:

$session = New-PSSession -ComputerName $Machines[$j] -Credential $credentials
$results = Invoke-Command -Session $session -ScriptBlock {
    Param(
        [Parameter(Mandatory=$true,Position=0)]
        [String]$host,
        [Parameter(Mandatory=$true,Position=1)]
        [String]$OSVersions,
        [Parameter(Mandatory=$true,Position=2)]
        [String]$TechInfoNew
    )
    $OSVersions = (Get-WMIObject win32_operatingsystem -ComputerName $host).caption
    return Network-Info -Machine $host -OSVersion $OSVersions -Techinfo $TechInfoNew

} -ArgumentList $Machines[$j], $OSVersions, $TechInfoNew
Export-Excel $FullPath -WorksheetName "Results" -StartColumn 1 -Title $Machines[$j] -TitleSize 12 -StartRow $i #fix the counter var
Export-Excel $FullPath -WorksheetName "Results" -StartColumn 2 -Title $OSVersions -TitleSize 12 -StartRow $i

foreach($result in $results){
    #Should have values now.
}

return ключевое слово не обязательно, но Рекомендуется, чтобы было легче читать, я также вижу, что внутри вашего foreach вы используете другую глобальную переменную, если она также была изменена функцией, которую вы также должны вернуть, чтобы вернуть несколько значений, создайте PSCustomObject, как это

.
. code
.
$customObject = [PSCustomObject]@{
    prop1 = value1;
    prop2 = value2;
    prop3 = value3;
}
return $customObject

Надеюсь, это поможет, удачи.

...