我有一个powershell 2.0脚本,它应该在多个服务器上运行命令并处理输出。 我想在后台作业中为每个服务器运行命令和处理。
该命令没有任何问题,并在半秒或更短的时间内终止:
Invoke-Command -ComputerName $client -ScriptBlock { #do some stuff }
但是当我在后台工作中运行时,工作不会终止:
Start-Job { Invoke-Command -ComputerName $client -ScriptBlock { #do some stuff } }
有人知道问题可能是什么吗?
答案 0 :(得分:4)
看起来你应该采取另一种方式:
http://technet.microsoft.com/en-us/library/hh849698.aspx
要在远程计算机上运行后台作业,请使用AsJob参数 在许多cmdlet上可用,或使用Invoke-Command cmdlet 在远程计算机上运行Start-Job命令。欲获得更多信息, 见about_Remote_Jobs。
答案 1 :(得分:1)
我更喜欢使用Start-Job来运行invoke-command,以便我可以使用Get-Job在中央计算机上查看和处理作业。
当我遍历“远程计算机列表”时,我使用“当前计算机名称”作为Start-Job中的-Name参数,以便我可以单独和作为一组来查看每个作业。
来自经验的两分钱。
编辑示例:
$job =
{
$remoteJob = { ##Do Stuff Here }
Invoke-Command -ComputerName $args[0] -ScriptBlock $remoteJob
}
Start-Job -Name <jobName> -ScriptBlock $job -ArgumentList <remoteComputer>
关于为什么作业“永远不会完成”的问题我没有其他输入,请确保您远程运行的代码确实已经结束。
希望这有帮助
答案 2 :(得分:0)
这也有效,至少在Powershell 5
中invoke-command -asjob -computer $PC -scriptblock { ## do stuff }
答案 3 :(得分:0)
对于最新版本的PS,您可以创建一个新会话,并将其与Invoke-Command start-job cmdlet一起使用,而不是直接使用ComputerName参数。
$s = new-pssession -computername Server01
invoke-command -session $s -scriptblock { start-job -scriptblock {get-eventlog system}}