例如,当我的PowerShell脚本尝试为不存在的服务器创建SQL Server对象时(在我的情况下为“bla”),PowerShell会以红色显示许多PowerShell错误。
由于我的脚本会在此类调用后检查$?
的值,并显示和记录错误,因此我不想显示多行PowerShell错误。
如何停用我的脚本显示的内容?
答案 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'”