为什么我的变量在 Invoke-Command 中显示为空

Why my variable appear empty in Invoke-Command

我制作了这个简短的脚本来监视并在需要时重新启动几台服务器上的打印机后台处理程序

$c = Get-Credential
$servers = 'FQDN1', 'FQDN2', 'FQDN3'
foreach ($s in $servers){
    Invoke-Command -ComputerName $s -Credential $c {$j = (Get-PrintJob -PrinterName 'Test Printer').count
        Write-Host "On computer $s there are $j print jobs"
        If ($j -gt 5){
            Write-Host "About to restart the printer spooler on $s"
            Restart-Service 'Spooler'
        }
    } # end of invoke-command
} # end of foreach

我不明白的是为什么 Write-Host 不写服务器名称 ($s),而是写作业数 ($j)。

我想这与变量在远程会话中但不在本地会话中有关。 但是我真的不明白到底是什么问题。

你是对的,你必须将变量传递给脚本块才能访问它。

为此,您必须在脚本块的开头定义一个 Param() 部分,并使用 -ArgumentList 参数传递参数(服务器):

$c = Get-Credential
$servers = 'FQDN1', 'FQDN2', 'FQDN3'
foreach ($s in $servers){
    Invoke-Command -ComputerName $s -Credential $c -ScriptBlock {
        Param($s)
        $j = (Get-PrintJob -PrinterName 'Test Printer').count
        Write-Host "On computer $s there are $j print jobs"
        If ($j -gt 5){
            Write-Host "About to restart the printer spooler on $s"
            Restart-Service 'Spooler'
        }
    }  -ArgumentList $s # end of invoke-command
} # end of foreach

从 PowerShell 3.0 开始,您可以使用 $using: 前缀引用远程会话脚本块中的局部变量:

foreach ($s in $servers){
    Invoke-Command -ComputerName $s -Credential $c {
        Write-Host "On computer $using:s now"
    } # end of invoke-command
} # end of foreach

有关详细信息,请参阅 about_Remote_Variables helpfile