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


78

我有一些代码:

$foo = someFunction

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

$foo = someFunction > $null

问题是,当我这样做时,尽管成功地阻止了警告消息,但它也具有不以函数结果填充$ foo的负面影响。

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

另外,如何将标准输出和标准错误都重定向为null?(在Linux中为2>&1。)


1
是什么产生警告消息?如果您是的作者someFunction,则可以适当地进行更改。
stej 2011年

实际上,在Bourne Shell(Linux)中,它是2>/dev/null 1>/dev/null; 您显示的重定向将stderr重定向到与stdout相同的位置-可以是/dev/null,也可以是常规文件。
jpaugh

Answers:


149

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

($foo = someFunction) | out-null

但这也有效:

($foo = someFunction) > $null

要使用“ someFunction”的结果定义$ foo后仅重定向标准错误,请执行

($foo = someFunction) 2> $null

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

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

$foo = (someFunction 2> $null)

要重定向两者,您有几种选择:

2>&1>$null
2>&1 | out-null

在我将语句包装在{花括号}中而不是(括号)中之后,此解决方案为我工作。我可能正在使用更新的PS版本。
ManEatingCheese

而且,如果我们要创建后台工作,则需要自己完成工作:{ myCommandWithAnyOutput & } | Out-Null
arberg


9

如果您要隐藏错误,可以这样做

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

4

应使用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'

要在命令提示符下使其更短,可以使用-wa 0

PS> WarningTest 'parameter alias test' -wa 0

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


0

使用功能:

function run_command ($command)
{
    invoke-expression "$command *>$null"
    return $_
}

if (!(run_command "dir *.txt"))
{
    if (!(run_command "dir *.doc"))
    {
        run_command "dir *.*"
    }
}

或者,如果您喜欢单线:

function run_command ($command) { invoke-expression "$command  "|out-null; return $_ }

if (!(run_command "dir *.txt")) { if (!(run_command "dir *.doc")) { run_command "dir *.*" } }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.