了解Powershell试试Catch

问题描述:

我遇到的问题了解try,catch语句的用法。了解Powershell试试Catch

我想用它作为一般的错误检测的情况下,这样是有任何问题,在给定功能的脚本将输出“服务器脱机”

以下代码段查询服务器上的WMI对象为它的硬盘列表并将其格式化为表格。如果服务器或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 
} 

塞缪尔

你会发现在我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抛出异常错误。

+1

最后一行'$ ErrorActionPreference =“stop”'对于try {} catch {}'来说是非常重要和方便的。如果'try {}'中的任何内容导致任何错误,它都会导致'catch {}'运行。 – BeowulfNode42 2014-02-14 08:36:05

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

你可以做的一件事是让命令抛出的任何错误终止错误,你可以用-ErrorAction Stop来做到这一点。通过'停止'将使错误成为允许catch块调用的终止错误