我在理解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
}
塞缪尔
答案 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块调用