PowerShell:错误检查一会儿真正的循环?

时间:2013-02-11 18:25:55

标签: powershell

我有一个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

}

我想我可以将我的预定任务改为每分钟运行一次,但到目前为止,这个循环似乎一直很好。只想在循环处于活动状态时引入错误检查。

2 个答案:

答案 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
}