在PowerShell中将输出重定向到$ null,但确保变量保持设置

ted*_*ted 67 powershell

我有一些代码:

$foo = someFunction
Run Code Online (Sandbox Code Playgroud)

这会输出一条警告消息,我想将其重定向到$ null:

$foo = someFunction > $null
Run Code Online (Sandbox Code Playgroud)

问题在于,当我这样做时,在成功抑制警告消息的同时,它也会产生负面的副作用,即不使用函数的结果填充$ foo.

如何将警告重定向到$ null,但仍然保持$ foo填充?

另外,如何将标准输出和标准错误重定向到null?(在Linux中,它是2>&1.)

小智 136

我更喜欢这种方式来重定向标准输出(本机PowerShell)......

($foo = someFunction) | out-null
Run Code Online (Sandbox Code Playgroud)

但这也有效:

($foo = someFunction) > $null
Run Code Online (Sandbox Code Playgroud)

在使用"someFunction"结果定义$ foo后重定向标准错误,执行

($foo = someFunction) 2> $null
Run Code Online (Sandbox Code Playgroud)

这实际上与上面提到的相同.

或者从"someFunction"重定向任何标准错误消息,然后使用结果定义$ foo:

$foo = (someFunction 2> $null)
Run Code Online (Sandbox Code Playgroud)

要重定向两者,您有几个选项:

2>&1>$null
2>&1 | out-null
Run Code Online (Sandbox Code Playgroud)

  • 如果我们正在创建一个后台作业,我们需要停止该作业本身:`{ myCommandWithAnyOutput & } | 出空` (2认同)

rav*_*nth 11

这应该工作.

 $foo = someFunction 2>$null
Run Code Online (Sandbox Code Playgroud)


Ryn*_*ant 5

应使用Write-Warningcmdlet编写警告消息,这允许使用-WarningAction参数或$WarningPreference自动变量抑制警告消息。需要使用一个函数CmdletBinding来实现此功能。

function WarningTest {
    [CmdletBinding()]
    param($n)

    Write-Warning "This is a warning message for: $n."
    "Parameter n = $n"
}

$a = WarningTest 'test one' -WarningAction SilentlyContinue

# To turn off warnings for multiple commads,
# use the WarningPreference variable
$WarningPreference = 'SilentlyContinue'
$b = WarningTest 'test two'
$c = WarningTest 'test three'
# Turn messages back on.
$WarningPreference = 'Continue'
$c = WarningTest 'test four'
Run Code Online (Sandbox Code Playgroud)

要在命令提示符下缩短它,您可以使用-wa 0

PS> WarningTest 'parameter alias test' -wa 0
Run Code Online (Sandbox Code Playgroud)

Write-Error、Write-Verbose 和 Write-Debug 为其相应类型的消息提供类似的功能。


Chr*_*lem 5

如果你想隐藏它的错误,你可以这样做

$ErrorActionPreference = "SilentlyContinue"; #This will hide errors
$someObject.SomeFunction();
$ErrorActionPreference = "Continue"; #Turning errors back on
Run Code Online (Sandbox Code Playgroud)