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

aemubtdh  于 2022-12-29  发布在  Shell
关注(0)|答案(6)|浏览(150)

我有一些代码:

$foo = someFunction

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

$foo = someFunction > $null

问题是,当我这样做时,虽然成功地抑制了警告消息,但它也有负面的副作用,即没有用函数的结果填充$foo。
如何将警告重定向到$null,但仍然保持$foo填充?
另外,如何将标准输出和标准错误都重定向为null(在Linux中为2>&1)。

wixjitnu

wixjitnu1#

我更喜欢这种方式来重定向标准输出(本机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

增编:

请注意,(Windows)powershell比基于Linux的操作系统拥有更多的流。以下是list from MS docs

因此,您可以使用通配符*>$null重定向 all 流,也可以使用file代替$null

amrnrhlw

amrnrhlw2#

这应该行得通。

$foo = someFunction 2>$null
yfjy0ee7

yfjy0ee73#

如果要隐藏错误,可以按如下方式执行

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

vlju58qv4#

应使用Write-Warning cmdlet编写警告消息,该cmdlet允许使用-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为其相应类型的消息提供类似的功能。

06odsfpq

06odsfpq5#

使用函数:

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 *.*" } }
pxyaymoc

pxyaymoc6#

最近,我不得不关闭Linux主机上的powershell,这并不是很明显,经过反复,我发现在$( )中 Package 一个命令,并在 Package 器工作后添加一个显式重定向。
我尝试过的其他任何东西都不会--我仍然不知道为什么,因为PowerShell文档的质量令人满意(而且充满了不一致......)
为了在启动时导入所有模块,我添加了以下内容。这会产生一些powershell的stderr输出,如果不使用 Package ,ErrorAction或重定向无法将其停止。
如果有人能详细说明为什么会这样,我们将不胜感激。

# import installed modules on launch 
 $PsMods = $(Get-InstalledModule); 
 $($PsMods.forEach({ Import-Module -Name $_.Name -ErrorAction Ignore })) *> /dev/null

相关问题