我们正在使用PowerShell 1.0开发的调度程序。它将作为我们服务器中的服务以无限循环运行。有时powershell会自动关闭。
我们需要记录一些有用的信息来解决此问题。 有人可以帮助我们吗?
谢谢,
Santhosh
答案 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 { ... }