了解Powershell Try Catch

时间:2013-02-12 23:50:25

标签: powershell try-catch

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

我想将它用作一般错误检测案例,因此在给定函数中存在任何问题,脚本将输出“Server Offline”

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

目前,当出现错误时,永远不会调用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 
}

塞缪尔

2 个答案:

答案 0 :(得分:3)

您可以在我的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引发的异常。或者,如果您希望所有Cdmlet在错误时抛出异常,则可以指定$ErrorActionPreference = "stop"

答案 1 :(得分:1)

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

您可以做的一件事是让命令抛出的任何错误都是终止错误,您可以使用-ErrorAction Stop执行此操作。传递'stop'将使错误成为终止错误,允许catch块调用

相关问题