我们有大约六打服务器ftp一对文本文件,每五分钟更新一次状态 . 我们尝试使用Windows任务计划程序和Powershell脚本的组合作为监视器和警报引擎 . 该脚本正在查找在过去60分钟内未刷新的文件,并在“确定”以外的任何条件下读取文件 . 我们希望计划的任务每五分钟运行一次 .
当$ statusfiles中定义的文件的某个while条件为真时(参见下面的脚本),当等待条件为false而不是处理列表中的下一个文件并观看时,脚本将挂起循环同一文件问题文件在后台 . 如果任何状态文件报告了问题,我们希望一旦脚本运行就知道 .
在我的第一个版本中,我使用了If-ElseIf-Else方法 . 这给了我正在寻找的即时通知,但如果我不循环警报条件,我不知道如何设置重试间隔($ retryinterval)给我们一个宽限期来修复底层问题 .
是否有可能使foreach方法与$ statusfiles中定义的所有文件并行运行?这会是系统密集型的吗?还是有另一种方法我没有看到?
在此先感谢您的帮助!
$erroractionpreference="SilentlyContinue"
$filepath = "\\Server\DirectoryA\DirectoryB\DirectoryC"
$statusfiles = "$filepath\opmessage21.txt","$filepath\pgmessage21.txt","$filepath\opmessage23.txt","$filepath\pgmessage23.txt","$filepath\opmessage24.txt","$filepath\pgmessage24.txt","$filepath\opmessage25.txt","$filepath\pgmessage25.txt","$filepath\opmessage26.txt","$filepath\pgmessage26.txt"
$agelimit = "60"
$retryinterval = "1800"
$to = "recipient1@email.com","recipient2@email.com","recipient3@email.com","recipient4@email.com"
$from = "alert@email.com"
$smtp = "smtp.server.com"
$port = "25"
function send-email
{
Send-MailMessage -Body "$body" -to $to -from $from -Subject "$subject" -smtp $smtp
}
foreach ($statusfile in $statusfiles) {
# Initialize the filestale and file error variables and strip the path and extension from $statusfile
$filestale = 0
$fileerror = 0
$messageid = $statusfile.split('\.')[-2]
# Get LastWriteTime of the file and alert the admin if LastWriteTime is older than X minutes
$lastupdated = (get-childitem $statusfile).LastWriteTime
while ($lastupdated -lt (get-date).AddMinutes(-$agelimit)) {
$filestale = 1
write-host "$messageid is older than $agelimit minutes. (Last updated: $lastupdated)"
$subject = "$messageid is older than $agelimit minutes"
$body = "Last updated: $lastupdated"
send-email
start-sleep -s $retryinterval
$lastupdated = (get-childitem $statusfile).LastWriteTime
}
# Alert the admin the file is no longer outdated
if ($filestale = 1) {
$filestale = 0
write-host "$messageid has been refreshed. (Last updated: $lastupdated)"
$subject = "$messageid has been refreshed"
$body = "Last updated: $lastupdated"
send-email
}
# Check the file for an error and alert the admin if the status is not OK
$messagecontents = Get-Content -Path "$statusfile" -Raw
while ($messagecontents -ne 'OK') {
$fileerror = 1
write-host "$messageid reported the following error: $messagecontents (Last updated: $lastupdated)"
$subject = "Error reported by $messageid"
$body = "$messagecontents (Last updated: $lastupdated)"
send-email
start-sleep -s $retryinterval
$messagecontents = Get-Content -Path "$statusfile" -Raw
$lastupdated = (get-childitem $statusfile).LastWriteTime
}
# Alert the admin the status is now OK
if ($fileerror = 1) {
$fileerror = 0
write-host "$messageid indicates status OK. (Last updated: $lastupdated)"
$subject = "$messageid indicates status OK"
$body = "Last updated: $lastupdated"
send-email
}
}