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