3

我在它的末尾有一个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

}

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

4

2 回答 2

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 $_
    }
}
于 2013-02-11T18:36:22.133 回答
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
}
于 2013-02-11T18:36:13.870 回答