Powershell Invoke-Command作业状态

时间:2013-08-08 20:46:39

标签: powershell remoting exit-code invoke-command

我有一个脚本(webdeploy.ps1)可以通过invoke-command在本地或远程运行。由于某种原因,webdeploy.ps1将失败并在到达脚本结束之前退出,因为webdeploy.ps1无法处理某些灾难性错误(即磁盘空间不足)。在记录错误的Write-Error之后脚本终止。最终用户会收到通知。一切都很好。

现在,当Invoke-Command -asjob远程执行webdeploy.ps1时,即使脚本失败,作业状态也始终返回“已完成”。有没有办法将作业状态设置为失败,这样当我运行get-job时,我可以立即看到哪个服务器失败/成功完成。

foreach ($webserver in $webServers)
{
    Invoke-Command -ComputerName $webServer -FilePath .\webdeploy.ps1 -AsJob -JobName "WebDeploy"
}



get-job | select name, id, State, Location | Format-Table -AutoSize

Name       Id State     Location               
----       -- -----     --------               
WebDeploy 102 Completed dev-web1
WebDeploy 104 Completed dev-web2

2 个答案:

答案 0 :(得分:1)

我相信,

Write-Error只会写出非终止错误,因此作业可能会感觉到错误,但不一定是终止错误。

您可能想尝试使用throw而不是Write-Error,或者使用非零返回代码显式退出(尽管我不确定后者实际上是否会产生很大的影响报告工作状态)。

要更深入地了解终止和非终止错误,以及何时使用Write-Errorthrow,请查看this thread

答案 1 :(得分:0)

您可以使用webdploy.ps1中的throw命令将作业状态设置为失败。

示例:

PS F:\> Start-Job -ScriptBlock { throw "error" }

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
5               Job5            Running    True            localhost             throw "error"


PS F:\> Get-Job

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
5               Job5            Failed     False           localhost             throw "error"