【问题标题】:Suppress Invoke-SQLCMD Warnings抑制 Invoke-SQLCMD 警告
【发布时间】:2017-06-07 16:19:20
【问题描述】:

我有以下代码:

invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Ignore -ErrorVariable var | Format-Table;

我需要从 powershell 输出中隐藏来自 invoke-sqlcmd 的任何错误,因为我已经将错误记录在单独的文件中。问题是,-ErrorAction Ignore(或 SilentlyContinue)不起作用,并且无法设置 $ErrorActionPreference。

【问题讨论】:

    标签: sql powershell sqlcmd


    【解决方案1】:

    如果您想按原样将内容发送到位桶,请使用以下三种技术之一:

    cmdlet | out-null
    

    或者...

    [void]cmdlet
    

    或...(与您的情况相关):

    cmdlet -ErrorVariable $errorvar
    cmdlet -WarningVariable $warningvar
    

    所有现代 shell 中的“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 stop 全部大写,因为它是必不可少的。错误捕获仅捕获终止错误。 PowerShell 默认为非终止(使用上面提到的错误操作首选项变量)错误,这就是为什么我们需要明确定义此 cmdlet 应在错误时终止的原因。这允许我们的错误捕获逻辑根据需要处理不同的可能错误情况。

    编辑——包括来自 cmets 的示例:

    try {
       $sql = invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Stop 
    } catch {
       ## do nothing, leave this blank or leave this comment
    }
    

    【讨论】:

    • 我不完全确定你的意思。我不需要处理错误,因为在我的场景中没有必要。我只想在脚本运行时阻止红色错误文本输出到 powershell 屏幕。该脚本的用户不需要知道错误发生在哪一行。
    • 如果你想抑制输出,提供了上面的选项:你要么需要找出“错误”来自哪个流并将其分配给变量或将其发送到位- bucket 或者您需要使用 try/catch 处理错误。即使你使用 try/catch 你也不需要在 catch 语句中做任何事情,你只需要有语法。
    【解决方案2】:

    我建议将它分配给一个变量:

    $response = invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Ignore -ErrorVariable var | Format-Table;
    

    如果您不将操作分配给变量,则该 cmdlet 返回的任何内容基本上都会转储到控制台中。

    在某些情况下,它还可能导致变量赋值问题(取决于代码的编写方式)。

    例如,如果您有一个返回值的函数,但没有与之关联的变量将返回到您正在调用该函数的实例。

    此外,我建议您确保您试图消除该问题的尝试不会干扰您的日志记录详细信息。我相信你的解决方法很简单,就像这个变量赋值一样。

    希望这有助于解决这个问题!

    【讨论】:

    • 我实际上已将它分配给一个变量,但它似乎与问题无关。无论哪种方式,错误都不会被抑制。
    • 抱歉,我一定误解了这个问题:您是否试图在 ISE 中禁止显示这些错误?
    猜你喜欢
    • 2011-03-31
    • 2019-10-22
    • 2014-12-19
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多