Powershell:如何阻止错误显示在脚本中?

时间:2011-12-05 16:41:17

标签: powershell error-handling

例如,当我的PowerShell脚本尝试为不存在的服务器创建SQL Server对象时(在我的情况下为“bla”),PowerShell会以红色显示许多PowerShell错误。

由于我的脚本会在此类调用后检查$?的值,并显示和记录错误,因此我不想显示多行PowerShell错误。

如何停用我的脚本显示的内容?

8 个答案:

答案 0 :(得分:99)

你有几个选择。最简单的方法是使用ErrorAction设置。

-Erroraction是所有cmdlet的通用参数。如果您要忽略特殊命令,则可以使用-erroraction 'silentlycontinue',它基本上会忽略该命令生成的所有错误消息。您还可以使用Ignore值(在PowerShell 3 +中):

  

与SilentlyContinue不同,Ignore不会将错误消息添加到$ Error自动变量。

如果要忽略脚本中的所有错误,可以使用系统变量$ErrorActionPreference并执行相同的操作:$ErrorActionPreference= 'silentlycontinue'

有关-ErrorAction的详细信息,请参阅about_CommonParameters。 有关$ ErrorActionPreference的详细信息,请参阅about_preference_variables

答案 1 :(得分:15)

Windows PowerShell提供了两种报告错误的机制:终止错误的一种机制非终止错误的另一种机制

内部CmdLets代码可以在发生错误时调用ThrowTerminatingError方法,该错误不会或不应该允许cmdlet继续处理其输入对象。脚本编写者可以使用异常来捕获这些错误。

EX:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

当cmdlet可以继续处理输入对象时,内部CmdLets代码可以调用WriteError方法来报告非终止错误。然后,脚本编写者可以使用-ErrorAction选项隐藏消息,或使用$ErrorActionPreference设置整个脚本行为。

答案 2 :(得分:6)

尝试使用[system.net.dns]解析主机名时出现类似问题。如果IP未解决.Net会发出终止错误。 为了防止终止错误并仍然保持对输出的控制,我使用TRAP创建了一个函数。

E.G。

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}

答案 3 :(得分:3)

您也可以将 2>$null 附加到您的命令中。

示例:

$rec = Resolve-DnsName $fqdn -Server $dns 2>$null

答案 4 :(得分:2)

在某些情况下,您可以在命令后通过管道将其空出

command | Out-Null

答案 5 :(得分:0)

你做错了。

您已经有了一个很好的大错误消息。为什么在地球上你想编写在每个命令后明确检查$?的代码?这非常麻烦且容易出错。正确的解决方案是停止检查$?

相反,使用PowerShell的内置机制为您炸毁。您可以通过将error preference设置为最高级别来启用它:

$ErrorActionPreference = 'Stop'

我把它放在我写过的每一个脚本的顶部,现在我不必检查$?。这使我的代码更加简单和可靠。

如果遇到确实需要禁用此行为的情况,您可以catch错误或使用公共-ErrorAction将设置传递给特定功能。在您的情况下,您可能希望您的进程在第一个错误上停止,捕获错误,然后记录它。

请注意,当外部可执行文件失败时(退出代码非零,传统上),这并不处理这种情况,因此如果您调用任何内容,仍需要检查$LASTEXITCODE。尽管存在这种限制,该设置仍然可以节省大量代码和工作量。

附加可靠性

您可能还想考虑使用strict mode

Set-StrictMode -Version Latest

这可以防止PowerShell在您使用不存在的变量时以及在其他奇怪的情况下进行静默处理。 (有关限制内容的详细信息,请参阅-Version参数。)

将这两个设置结合起来使PowerShell成为更加快速失败的语言,这使得编程变得更加容易。

答案 6 :(得分:0)

-ErrorAction SilentlyContinue添加到脚本中,您就可以开始使用

答案 7 :(得分:-1)

如果您希望cmdlet的powershell errormessage被抑制,但仍想捕获错误,请使用“-erroraction'ilentntlyStop'”