为什么我的变量在Invoke-Command

时间:2016-06-14 08:13:59

标签: powershell powershell-remoting

我制作了这个简短的脚本来监控,如果需要,可以在几台服务器上重启打印机假脱机程序

$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)。< / p>

我想这与远程会话中的变量有关,但与本地变量没有关系。 但我无法真正理解究竟是什么问题。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

为此,您必须在脚本块的开头定义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