我们有一个在 powershell 1.0 中开发的调度程序。它将作为我们服务器中的服务无限循环运行。有时powershell会自动关闭。
我们需要记录一些有用的信息来解决这个问题。有人可以帮助我们吗?
谢谢,
桑托什
我们有一个在 powershell 1.0 中开发的调度程序。它将作为我们服务器中的服务无限循环运行。有时powershell会自动关闭。
我们需要记录一些有用的信息来解决这个问题。有人可以帮助我们吗?
谢谢,
桑托什
您应该trap
在脚本一开始就使用该说明。该trap
指令将捕获 PowerShell 代码中的任何异常。在陷阱脚本块中,您只需在文件或 Windows 日志中记录异常。
您可以尝试的一件事是订阅 PowerShell.Exiting 引擎事件。如果 PowerShell 不是通过 X 按钮关闭,它将无法工作,而且我不确定如果 PowerShell 意外崩溃,它是否可以工作。
Register-EngineEvent PowerShell.Exiting -SupportEvent –Action { ... }
您可以通过将其添加到脚本的开头来记录 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以每四分之一秒进行一次轮询。