1

我一直在编写一个脚本来对远程设备运行一些网络连接检查,当我在我的机器上本地运行它时,所有功能似乎都在工作。

但是,一旦我将 Invoke-Command 添加到我的脚本中,它就会很好地连接到服务器,但是我的函数中的所有变量都得到了“空”值。

我正在使用全局变量来超出我的函数范围,因此我可以与它们交互,因为我无法以其他方式返回它们。

这是失败的代码部分:

$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 语句中抛出。

提前致谢。

4

1 回答 1

1

对于我所看到的,您正在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

希望对你有帮助,祝你好运。

于 2020-04-09T02:17:22.267 回答