【问题标题】:Understanding Powershell Try Catch了解 Powershell 尝试 Catch
【发布时间】:2016-02-09 03:15:15
【问题描述】:

我在理解 try、catch 语句的使用时遇到问题。

我想将它用作一般的错误检测案例,以便在给定函数中存在任何问题,脚本将输出“服务器脱机”

下面的 sn-p 查询服务器上的 WMI 对象以获取其 HDD 列表并将其格式化为表格。如果服务器或 WMI 不可用,我希望将“服务器脱机”附加到 txt 输出文件。

目前,当出现错误时,从不调用 catch 语句。

try catch 可以这样用吗?

try {
    Get-WmiObject Win32_LogicalDisk -ComputerName  $server   | ft $server,deviceid,@{Label="Size(GB)";Expression={($_.Size/ 1gb) -as [int]}},@{Label="FreeSpace(Mb)";Expression={($_.FreeSpace/1mb) -as [int]}} -auto  | Out-File  c:\temp\ServersHDDAudit_OUTPUT-$a-$b.txt -Append

}
catch {
    $server + ": Server Offline" | Out-File  c:\temp\ServersHDDAudit_OUTPUT-$a-$b.txt -Append 
}

塞缪尔

【问题讨论】:

    标签: powershell try-catch


    【解决方案1】:

    您可以在我的other post here 之一中找到相关信息,但是当您在 PowerShell 中编写 CmdLet 时,您可以决定抛出异常或管理错误。 Get-WmiObject 管理错误,以便写入错误并返回一个值。您可以要求它“静默继续”并抛出您自己的异常。

    try
    {
      $ld = Get-WmiObject Win32_LogicalDisk -ComputerName  $server -ErrorAction SilentlyContinue
      if ($ld -ne $null)
      {
        $ld | ft $server,deviceid,@{Label="Size(GB)";Expression={($_.Size/ 1gb) -as [int]}},@{Label="FreeSpace(Mb)";Expression={($_.FreeSpace/1mb) -as [int]}} -auto  | Out-File  c:\temp\ServersHDDAudit_OUTPUT-$a-$b.txt -Append
      }
      else
      {
        throw $Error[0].exception.Message
      }
    }
    catch
    {
      $server + ": $_" | Out-File  c:\temp\ServersHDDAudit_OUTPUT-$a-$b.txt -Append 
    }
    

    备注:可以设置-ErrorAction Stop参数让Get-WmiObject抛出异常。或者您可以指定$ErrorActionPreference = "stop",如果您希望所有 Cdmlet 在错误时抛出异常。

    【讨论】:

    • 最后一行$ErrorActionPreference = "stop" 非常重要且方便try {} catch {} 按预期工作。如果try {} 中的任何内容导致任何错误,它将导致catch{} 运行。
    【解决方案2】:

    Try/catch 仅适用于终止错误。根据我的经验,Get-WmiObject 产生的 99% 的错误都没有终止,因此在这种情况下 catch 不会有任何影响。

    您可以做的一件事是使命令引发的任何错误成为终止错误,您可以使用-ErrorAction Stop 来做到这一点。传递 'stop' 将使错误成为终止错误,从而允许调用 catch 块

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2013-06-19
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      相关资源
      最近更新 更多