1

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

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

下面的代码片段查询服务器上的 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 
}

塞缪尔

4

2 回答 2

3

您可以在我的一篇文章中找到相关信息,但是当您在 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 在出现错误时都抛出异常。

于 2013-02-13T04:45:09.123 回答
1

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

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

于 2013-02-13T07:41:50.877 回答