我制作了这个简短的脚本来监控,如果需要,可以在几台服务器上重启打印机假脱机程序
$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>
我想这与远程会话中的变量有关,但与本地变量没有关系。 但我无法真正理解究竟是什么问题。
答案 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