我有一个脚本(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
答案 0 :(得分:1)
Write-Error
只会写出非终止错误,因此作业可能会感觉到错误,但不一定是终止错误。
您可能想尝试使用throw
而不是Write-Error
,或者使用非零返回代码显式退出(尽管我不确定后者实际上是否会产生很大的影响报告工作状态)。
要更深入地了解终止和非终止错误,以及何时使用Write-Error
与throw
,请查看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"