首页 > 开发 > PowerShell > 正文

浅谈PowerShell 捕获错误

2020-05-30 20:20:51
字体:
来源:转载
供稿:网友

之前的文章我们演示了如何使用 Windows PowerShell 构建相当高级的清单工具。我创建的工具提供了多个有关输出的选项,这应归功于外壳的内置功能和将函数应用于对象。

我所创建的函数有一个无可否认的弱点:它不能适度处理可能发生的任何错误(例如连接或权限问题)。这正是我要在本期的 Windows PowerShell 专栏中加以解决的,我将介绍 Windows PowerShell 所提供的错误处理功能。

设置 Trap

在 Windows PowerShell 中,Trap 关键字定义一个错误处理程序。当您的脚本中出现异常时,外壳会检查是否已经定义 Trap,这意味着它必须在发生任何异常之前出现在脚本中。对于本演示,我将整理出一个会产生连接性问题的测试脚本:我将使用 Get-WmiObject 连接网络中并不存在的计算机名。我的目标是让错误 Trap 将无效计算机名写出到一个文件中,从而为我提供一个记录了无效计算机名的文件。我还将加入到两个有效计算机的连接(我将使用 localhost)。请参见图 1 中的脚本。

添加 Trap

trap { write-host "Error connecting to $computer" -fore red "$computer" | out-file c:/demo/errors.txt -append  continue}$computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer $computer = "server2"get-wmiobject win32_operatingsystem -comp $computer $computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer

此脚本的输出(如图 2 所示)与我的期望不符。请注意 "Error connecting to…" 消息不显示。也没有创建 Errors.txt 文件。也就是说,根本没有执行我的 Trap。究竟发生了什么?

图 2 这不是我所希望的输出!

停止!

关键在于了解正常外壳错误消息与异常不同(分为非终止错误和终止错误。终止错误会停止管道的执行并产生异常)。只有异常才能被捕获。出现错误时,外壳会检查其内置的 $ErrorActionPreference 变量以确定自己要执行的操作。该变量默认含有 "Continue" 值,它表示“显示错误消息并继续”。将此变量更改为 "Stop" 会使其显示错误消息并产生可捕获的异常。但这意味着您脚本中的任何错误也将执行该操作。

更好的方法是只让您认为可能会引发问题的 cmdlet 使用“停止”行为。可以使用 –ErrorAction(或 –EA)参数(一个所有 cmdlet 都支持的常见参数)完成此操作。图 3 显示了此脚本的修订版本。它将按照预期方式工作,产生的输出如图 4 所示。

 使用 -ErrorAction

trap { write-host "Error connecting to $computer" -fore red  "$computer" | out-file c:/demo/errors.txt -append  continue}$computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer -ea stop$computer = "server2"get-wmiobject win32_operatingsystem -comp $computer -ea stop$computer = "localhost"get-wmiobject win32_operatingsystem -comp $computer -ea stop            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表