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


92

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

由于我的脚本检查了 $?此类调用之后,并显示和记录错误,因此我宁愿不要同时显示几行PowerShell错误。

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

Answers:


132

您有两种选择。最简单的方法是使用ErrorAction设置。

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

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

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

有关-ErrorAction的更多信息,请参见about_CommonParameters。有关$ ErrorActionPreference的更多信息,请参见about_preference_variables


您是否需要在-erroraction'silentlycontinue'中使用单引号?Intellisese正在显示选项,并且未添加单引号。
PAS

1
如果以上格式对您不起作用,请参考上面提供的链接。我必须按照-ErrorAction:SilentlyContinuePS 5.1 进行格式化。我正在批量调用cmdlet,所以我不知道这有什么不同。但是,当您知道可能会引发可接受的错误时,会提供很好的信息。
大卫

--rm。\ Windows.old \ -Force -Recurse -Verbose -ErrorAction SilentlyContinue -WarningAction SilentlyContinue </ code>
Tertius Geldenhuys

18

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

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

例如:

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

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


8

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

例如

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

3

您在这里偏离了轨道。

您已经有一个不错的错误消息。为什么在地球上,您要编写$?每个命令之后进行显式检查的代码?这非常麻烦并且容易出错。正确的解决方案是停止检查$?

而是使用PowerShell的内置机制为您爆炸。您可以通过将错误首选项设置为最高级别来启用它:

$ErrorActionPreference = 'Stop'

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

如果遇到确实需要禁用此行为的情况,则可以catch使用通用命令将错误或设置传递给特定功能-ErrorAction。对于您的情况,您可能希望您的过程在第一个错误时停止,捕获该错误,然后将其记录下来。

请注意,这在外部可执行文件失败时(常规情况下退出代码为非零)不会解决这种情况,因此您仍然需要检查$LASTEXITCODE是否调用了任何可执行文件。尽管有此限制,该设置仍节省大量代码和精力。

额外的可靠性

您可能还需要考虑使用严格模式

Set-StrictMode -Version Latest

这样可以防止在使用不存在的变量和其他异常情况时,PowerShell静默进行。(有关-Version限制的详细信息,请参阅参数。)

结合这两种设置,PowerShell可以使用更多的快速故障处理语言,从而大大简化了其中的编程。



2

在某些情况下,您可以在命令后通过管道发送空值

command | Out-Null

-1

如果您希望抑制cmdlet的Powershell错误消息,但仍想捕获该错误,请使用“ -erroraction'silentlyStop'”


没有这样的动作。完全有一个停止动作。
Marvin Dickhaus,2015年

但是它允许禁止显示红色错误消息,并且在使用New-Item -ItemType directory(PowerShell v2.0)时仍然使用catch命令/部分
Milan Kerslager

@MilanKerslager,您能否显示一个代码示例-因为我和其他所有人都相信没有像“ SilentlyStop”这样的ActionPreference
FSCKur

我有理由相信Mikkel的意思是SilentlyContinue而不是SilentlyStop,因为这在您想要执行的操作的内容上更具意义。
约翰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.