该工具非常适合管理配置基线。Compare-Object(或 Diff)旨在对比两组对象。默认情况下,它将比较每个对象的所有属性,并由该命令输出所有不同之处。所以设想您已将某个服务器的服务完全按照您所需的方式进行了配置。只需运行下面的内容就能创建基线:
Get-Service | Export-CliXML c:baseline.xml
几乎所有对象都可以输送到 Export-CliXML,它会将对象转换为 XML 文件。而后,您可以运行同一命令(如 Get-Service)并将结果与保存的 XML 进行比较。命令如下:
Compare-Object (Get-Service) (Import-CliXML c:baseline.xml) –property name
添加 –property 参数将强制比较仅查看该属性,而非整个对象。在本例中,您将得到由不同于原始基线的所有服务名称组成的列表,让您了解在创建后基线是否添加或删除了任何服务。
断开
我在前面提到过 Break 关键字。图 5 显示了一个如何运用 Break 关键字的示例。
使用 Break 关键字
Trap {
# Handle the error
Continue
}
Function MyFunction {
Trap {
# Log error to a file
If ($condition) {
Continue
} Else {
Break
}
}
Get-WmiObject Win32_Service –comp "Server2" –ea "Stop"
Get-Process
}
MyFunction
Write-Host "Testing!"
以下简要概述了执行链。首先执行第 19 行,它调用第 6 行中的函数。执行第 15 行并产生异常。该异常在第 7 行捕获,然后 Trap 必须在第 9 行做出决定。假设 $condition 为 True,Trap 将在第 16 行继续执行。
但是,如果 $condition 为 False,Trap 将发生中断。这将退出当前作用域,并将原始异常传递至父项。从外壳角度看,这意味着第 19 行产生了异常,并被第 1 行捕获。Continue 关键字将强制外壳继续执行第 20 行。
实际上,这两个 Trap 中都包含了略多一些的代码,用于处理错误,对其进行记录等等。在本例中我只是省略了这种函数代码,以使实际流程更易于查看。
为什么要担心呢?
您何时需要捕获错误?有两种情况:预测可能会发生错误以及当您想要某种超越普通错误消息的行为时(例如将错误记录到文件或显示更有帮助的错误消息)。
通常我在复杂一些的脚本中加入错误处理,以帮助处理我可以预见发生的错误。这些错误包括但不限于连接不良或权限问题等错误。
错误捕获无疑需要花费更多的时间和精力才能了解。但当您在 Windows PowerShell 中处理更加复杂的任务时,很有必要实施错误捕获,以帮助您构建更加完善、专业的工具。










