3

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

该命令可以正常工作,并在半秒或更短的时间内终止:

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

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

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

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

4

4 回答 4

4

看起来你应该这样做:

http://technet.microsoft.com/en-us/library/hh849698.aspx

要在远程计算机上运行后台作业,请使用许多 cmdlet 上可用的 AsJob 参数,或使用 Invoke-Command cmdlet 在远程计算机上运行 Start-Job 命令。有关详细信息,请参阅 about_Remote_Jobs。

于 2013-07-17T09:42:18.747 回答
2

我更喜欢使用 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>

对于您关于为什么作业“永远不会完成”的问题,除了确保您远程运行的代码确实结束之外,我没有其他输入。

希望这可以帮助

于 2014-03-25T14:20:51.967 回答
1

这也可以工作,至少在 Powershell 5 中

invoke-command -asjob -computer $PC -scriptblock { ## do stuff }
于 2016-06-30T02:39:51.263 回答
0

对于 PS 的最新版本,您可以创建一个新会话并将其与 Invoke-Command start-job cmdlet 一起使用,而不是直接使用 ComputerName 参数。

$s = new-pssession -computername Server01
invoke-command -session $s -scriptblock { start-job -scriptblock {get-eventlog system}}
于 2019-05-22T19:13:15.423 回答