[英]Suppress Invoke-SQLCMD Warnings
我有以下代码:
invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Ignore -ErrorVariable var | Format-Table;
我需要将来自invoke-sqlcmd的任何错误从powershell输出中隐藏出来,因为我已经将错误记录在一个单独的文件中。 问题是,-ErrorAction忽略(或SilentlyContinue)不起作用,并且设置$ ErrorActionPreference不是选项。
如果您想按原样发送东西到位桶,请使用以下三种技术之一:
cmdlet | out-null
要么...
[void]cmdlet
或...(与您的情况有关):
cmdlet -ErrorVariable $errorvar
cmdlet -WarningVariable $warningvar
所有现代外壳中的“ I / O”都是通过流完成的。 最常见的是标准输出(STDOUT),标准错误(STDERR)和标准输入(STDIN)。 PowerShell还有很多(例如调试,详细信息等)。 大多数情况下,正常输出进入3个主要流之一。 但是,也可以从详细流或调试流中发出数据。 大多数交互基于3种主要类型,因此,当尝试从cmdlet分配输出时,您实际上是在尝试从STDOUT分配某些内容,但数据来自STDERR。
万一您的问题与实际处理错误有关,则需要捕获该错误,因此语法如下:
try {
cmdlet -ERRORACTION STOP
} catch {
## Do something with $_ or $error[0] or nothing at all
}
-erroraction停止在所有大写字母中,因为它是必不可少的。 错误陷阱仅捕获终止错误。 PowerShell默认将错误设置为非终止(使用上面提到的错误操作首选项变量),这就是为什么我们需要明确定义此cmdlet应在错误时终止的原因。 这使我们的错误捕获逻辑可以根据需要处理各种可能的错误情况。
编辑-包括注释示例:
try {
$sql = invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Stop
} catch {
## do nothing, leave this blank or leave this comment
}
我建议将其分配给变量:
$response = invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Ignore -ErrorVariable var | Format-Table;
如果不将操作分配给变量,则该cmdlet返回的所有内容基本上都将转储到控制台中。
在某些情况下,它还会导致变量分配出现问题(取决于代码的编写方式)。
例如,如果您有一个返回值的函数,但是没有与之关联的变量,该变量将返回给您在其中调用该函数的实例。
此外,我建议您确保使该问题静音的尝试不会干扰您的日志记录详细信息。 我相信您的解决方法很简单,只需执行此变量分配即可。
希望这有助于解决问题!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.