首页 > 解决方案 > 如何评估 PowerShell 中是否返回数据或错误?

问题描述

我正在尝试使用以下 cmdlet 测试 Powershell 中是否存在 DNS 区域:

Get-DNSServerZone abc.com

这很好用,但我现在需要做的是根据是否存在错误或是否返回数据将其转换为真/假评估。

例如,这是一个真实的场景:

$a = Get-DnsServerZone abc.com
$a

ZoneName                            ZoneType        IsAutoCreated   IsDsIntegrated  IsReverseLookupZone  IsSigned
--------                            --------        -------------   --------------  -------------------  --------
abc.com                            Secondary       False           False           False

而这是一个错误的场景:

$a = Get-DnsServerZone def.com
Get-DnsServerZone : The zone def.com was not found on server DNSSERVER1.
At line:1 char:6
+ $a = Get-DnsServerZone def.com
+      ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (def.com:root/Microsoft/...S_DnsServerZone) [Get-DnsServerZone], CimException
+ FullyQualifiedErrorId : WIN32 9601,Get-DnsServerZone

我正在苦苦挣扎的是如何对此进行评估?用外行的话来说,我需要检查是否$a有实际数据。

非常感谢!

标签: powershell

解决方案


我现在需要做的是根据是否有错误或是否返回数据将其转换为真/假评估。

如果您可以简单地忽略失败并且不需要返回的对象Get-DNSServerZone,则可以执行以下操作:

$zoneExist = [bool] (Get-DNSServerZone abc.com -ErrorAction Ignore)
  • -ErrorAction Ignore悄悄地忽略任何(非终止)错误。

    • 传递Ignore公共-ErrorAction参数) 只是丢弃错误,而SilentlyContinue,虽然也没有输出错误,但仍将其记录自动$Error收集中,以便以后检查。

    • 您还可以通过common参数-ErrorAction SilentlyContinue补充类似的东西
      -ErrorVariable err,这将另外记录自选变量中的命令特定错误。$err-ErrorVariable

  • 利用PowerShell的隐式到布尔转换[bool],将映射Get-DNSServerZone的输出转换为$true(输出描述区域的对象)或$false(没有输出(到成功输出流),因为发生了错误)。

如果您也想要区域描述对象:

$zoneExist = [bool] ($zoneInfo = Get-DNSServerZone abc.com -ErrorAction Ignore)

另一种方法是首先捕获区域信息,然后查询自动$?变量,该变量包含一个布尔值($true$false),指示最近执行的语句是否导致任何错误(无论是否被抑制)。

$zoneInfo = Get-DNSServerZone abc.com -ErrorAction Ignore
$zoneExist = $?

推荐阅读