例如,当我的PowerShell脚本尝试为不存在的服务器(在我的情况下为“ bla”)创建SQL Server对象时,PowerShell以红色显示许多PowerShell错误。
由于我的脚本检查了 $?
此类调用之后,并显示和记录错误,因此我宁愿不要同时显示几行PowerShell错误。
如何停用那些为我的脚本显示的内容?
Answers:
您有两种选择。最简单的方法是使用ErrorAction
设置。
-Erroraction
是所有cmdlet的通用参数。如果有要忽略的特殊命令-erroraction 'silentlycontinue'
,则可以使用该命令,该命令将基本上忽略该命令生成的所有错误消息。您还可以使用该Ignore
值(在PowerShell 3+中):
与SilentlyContinue不同,忽略不将错误消息添加到$ Error自动变量中。
如果要忽略脚本中的所有错误,可以使用系统变量 $ErrorActionPreference
并执行相同的操作:$ErrorActionPreference= 'silentlycontinue'
有关-ErrorAction的更多信息,请参见about_CommonParameters。有关$ ErrorActionPreference的更多信息,请参见about_preference_variables。
-ErrorAction:SilentlyContinue
PS 5.1 进行格式化。我正在批量调用cmdlet,所以我不知道这有什么不同。但是,当您知道可能会引发可接受的错误时,会提供很好的信息。
Windows PowerShell提供了两种报告错误的机制:一种机制用于终止错误,另一种机制用于非终止错误。
ThrowTerminatingError
当发生不允许或不应该允许cmdlet继续处理其输入对象的错误时,内部CmdLets代码可以调用一个方法。脚本编写者可以使用异常捕获这些错误。
例如:
try
{
Your database code
}
catch
{
Error reporting/logging
}
WriteError
当cmdlet可以继续处理输入对象时,内部CmdLets代码可以调用方法以报告非终止错误。然后,脚本编写者可以使用-ErrorAction选项隐藏消息,或使用$ErrorActionPreference
来设置整个脚本行为。
您在这里偏离了轨道。
您已经有一个不错的错误消息。为什么在地球上,您要编写$?
在每个命令之后都进行显式检查的代码?这非常麻烦并且容易出错。正确的解决方案是停止检查$?
。
而是使用PowerShell的内置机制为您爆炸。您可以通过将错误首选项设置为最高级别来启用它:
$ErrorActionPreference = 'Stop'
我把它放在我曾经写过的每个脚本的顶部,现在不必检查$?
。这使我的代码更加简单和可靠。
如果遇到确实需要禁用此行为的情况,则可以catch
使用通用命令将错误或设置传递给特定功能-ErrorAction
。对于您的情况,您可能希望您的过程在第一个错误时停止,捕获该错误,然后将其记录下来。
请注意,这在外部可执行文件失败时(常规情况下退出代码为非零)不会解决这种情况,因此您仍然需要检查$LASTEXITCODE
是否调用了任何可执行文件。尽管有此限制,该设置仍节省大量代码和精力。
您可能还需要考虑使用严格模式:
Set-StrictMode -Version Latest
这样可以防止在使用不存在的变量和其他异常情况时,PowerShell静默进行。(有关-Version
限制的详细信息,请参阅参数。)
结合这两种设置,PowerShell可以使用更多的快速故障处理语言,从而大大简化了其中的编程。
添加-ErrorAction SilentlyContinue
到您的脚本中,您将一切顺利。
如果您希望抑制cmdlet的Powershell错误消息,但仍想捕获该错误,请使用“ -erroraction'silentlyStop'”
New-Item -ItemType directory
(PowerShell v2.0)时仍然使用catch命令/部分