我有一个while($true)
循环,其末尾有一个start-sleep -s 60
。目的是启动外部PowerShell脚本作为不同的用户,它将运行服务器列表,检查事件日志中的最后一分钟内的更改并做出相应的反应。
由于我的while循环(下面)使用-credential
标志以其他人的身份运行脚本,我担心错误(例如帐户被锁定,密码过期,文件丢失等)。
我尝试了if ($error)
语句,并更改了外部脚本的文件名,但我从未收到警报。我在想它是因为它永远不会停止重新检查自己?
while($true) {
# Start the scan
Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1'
# Sleep 60 seconds
start-sleep -s 60
}
我想我可以将我的预定任务改为每分钟运行一次,但到目前为止,这个循环似乎一直很好。只想在循环处于活动状态时引入错误检查。
答案 0 :(得分:3)
你试过try / catch块吗?错误的凭据是终止错误,因此在凭据错误后,try块中的其余代码将不会运行。当你抓住它时,你可以做任何你想做的事情。例如。
try {
Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1'
} catch {
#Catches terminating exceptions and display it's message
Write-Error $_.message
}
如果您想捕获所有错误,请将-ErrorAction Stop
添加到Start-Process
行。如上所述,凭据应该是终止错误,这使得erroraction
参数不必要
编辑为什么首先使用Start-Process
来运行脚本?我将其切换到Invoke-Command
远程运行PowerShell脚本。缺少脚本文件时,您将收到一个非终止错误。因为它是一个非终止错误,我们需要使用-ErrorAction Stop
参数。要捕获丢失文件错误和其他所有错误(如凭据),请使用以下内容:
try { Invoke-Command -ScriptBlock { & c:\batch\02-Scan.ps1 } -ErrorAction Stop
} catch {
if ($_.Exception.GetType().Name -eq "CommandNotFoundException") {
Write-Error "File is missing"
} else {
Write-Error "Something went wrong. Errormessage: $_"
#or throw it directly:
#throw $_
}
}
答案 1 :(得分:0)
也许?
while($true) {
# Start the scan
try{
Start-Process powershell -Credential $credentials -ArgumentList '-noprofile -command & c:\batch\02-Scan.ps1' -ErrorAction Stop
}
catch {
send-alert
break
}
# Sleep 60 seconds
start-sleep -s 60
}