当PowerShell意外关闭时,需要记录错误详细信息

时间:2013-07-31 12:25:45

标签: powershell

我们正在使用PowerShell 1.0开发的调度程序。它将作为我们服务器中的服务以无限循环运行。有时powershell会自动关闭。

我们需要记录一些有用的信息来解决此问题。 有人可以帮助我们吗?

谢谢,

Santhosh

3 个答案:

答案 0 :(得分:0)

您应该在脚本开头使用trap指令。 trap指令将捕获PowerShell代码中的任何异常。在trap scriptblock中,您只需要在文件或Windows日志中记录异常。

答案 1 :(得分:0)

您可以通过将其添加到脚本的开头来记录PowerShell会话的完整记录:

Start-Transcript <path to transcript file> -Append

为方便起见,请将成绩单文件扩展为.txt。

-Append 开关会阻止每个会话覆盖早期会话的成绩单。您将能够告诉哪个输出来自哪个会话,因为脚本添加了一个页眉和页脚,告诉您成绩单的开始和结束时间,以及主机名,操作系统版本以及它运行的帐户。


正如我在评论中提到的,PowerShell会话本身显然不可能在其意外终止时报告,但您可以让另一个脚本将其作为后台作业启动并继续轮询直到结束,然后报告时间和退出状态。这个功能可以解决这个问题:

function Measure-EndTime {
  param(
    [string]$Command,
    [int]$PollingInterval  # seconds
  )

  $job = Start-Job -ScriptBlock {$Command}
  do {
    sleep $PollingInterval
  } until ($job.State -ne 'Running')
  echo "Job ended $(Get-Date -format 'yyyy-MM-dd HH:mm:ss.ff'): $($job.State)"
}

你会这样调用它:

Measure-EndTime -Command "& <path>\scheduler.ps1" -PollingInterval 10

这将为您提供约10秒准确度的结束时间,并显示Job ended 2013-08-05_17-57-18.24: Completed之类的消息。您可以增加或减少轮询间隔,以获得您想要承受的系统负载所需的准确度。轮询间隔不必是整数。如果需要,您可以将其设置为 .25 以每季度轮询一次。

答案 2 :(得分:0)

您可以尝试的一件事是订阅PowerShell.Exiting引擎事件。如果不通过X按钮关闭PowerShell,它将无法工作,如果PowerShell意外崩溃,我不确定它是否有效。

Register-EngineEvent PowerShell.Exiting -SupportEvent –Action { ... }