我有以下代码:
invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Ignore -ErrorVariable var | Format-Table;我需要在powershell输出中隐藏invoke-sqlcmd中的任何错误,因为我已经在一个单独的文件中记录了这些错误。问题是,-ErrorAction Ignore (或SilentlyContinue)不起作用,并且不能设置$ErrorActionPreference。
发布于 2017-06-08 00:28:02
如果您想像以前那样将数据发送到bit-bucket,请使用以下三种技术之一:
cmdlet | out-null或者..。
[void]cmdlet或者..。(与您的情况相关):
cmdlet -ErrorVariable $errorvar
cmdlet -WarningVariable $warningvar所有现代shell中的"I/O“都是通过流完成的。最常见的是标准输出(STDOUT)、标准错误(STDERR)和标准输入(STDIN)。PowerShell有更多的功能(例如调试、详细等)。大多数情况下,正常输出会进入三个主流之一。但是,数据也可以从详细流或调试流中发出。大多数交互都是基于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
}发布于 2017-06-08 00:20:58
我建议将其赋给一个变量:
$response = invoke-sqlcmd -ServerInstance $server\$instance -InputFile "$Path\checkDBEncryption.sql" -ErrorAction Ignore -ErrorVariable var | Format-Table;如果不将操作分配给变量,则该cmdlet返回的任何内容基本上都将转储到控制台中。
在某些情况下,它还会导致变量赋值问题(取决于代码的编写方式)。
例如,如果有一个函数返回一个值,但没有与之关联的变量,则该变量将返回到调用该函数的实例。
此外,我建议您确保您试图使该问题保持沉默,这不会影响您的日志记录详细信息。我相信你的修复很简单,就像这个变量赋值一样。
希望这对这个问题有所帮助!
https://stackoverflow.com/questions/44418020
复制相似问题