抑制Invoke-SQLCMD警告

时间:2017-06-07 16:19:21

标签: sql powershell sqlcmd

我有以下代码:

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

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

2 个答案:

答案 0 :(得分: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
}

-rororaction stop全部上限,因为它是必不可少的。错误捕获仅捕获终止错误。 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
}

答案 1 :(得分:0)

我建议将其分配给变量:

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

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

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

作为一个例子,如果你有一个函数返回一个值,但没有与之关联的变量,它将被返回到你调用该函数的实例。

此外,我建议您确保尝试解决该问题并未干扰您的日志记录详细信息。我相信你的修复很简单,因为这个变量赋值。

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