我有以下代码:
invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Ignore -ErrorVariable var | Format-Table;
我需要将来自invoke-sqlcmd的任何错误从powershell输出中隐藏,因为我已经将错误记录在单独的文件中。问题是,-ErrorAction Ignore(或SilentlyContinue)不起作用,并且设置$ ErrorActionPreference不是一个选项。
答案 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返回的任何内容基本上都会被转储到控制台中。
在某些情况下,它也会导致变量赋值问题(取决于代码的编写方式)。
作为一个例子,如果你有一个函数返回一个值,但没有与之关联的变量,它将被返回到你调用该函数的实例。
此外,我建议您确保尝试解决该问题并未干扰您的日志记录详细信息。我相信你的修复很简单,因为这个变量赋值。
希望这有助于解决这个问题!