繁体   English   中英

禁止调用SQLCMD警告

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM