在后台作业中调用Command

时间:2013-07-17 09:32:29

标签: powershell invoke-command start-job

我有一个powershell 2.0脚本,它应该在多个服务器上运行命令并处理输出。 我想在后台作业中为每个服务器运行命令和处理。

该命令没有任何问题,并在半秒或更短的时间内终止:

Invoke-Command -ComputerName $client -ScriptBlock { #do some stuff }

但是当我在后台工作中运行时,工作不会终止:

Start-Job { Invoke-Command -ComputerName $client -ScriptBlock { #do some stuff } }

有人知道问题可能是什么吗?

4 个答案:

答案 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}}