Перенаправление вывода в $null в PowerShell, но с сохранением значения переменной

У меня есть код:

$foo = someFunction

Это выводит предупреждающее сообщение, которое я хочу перенаправить на $ null:

$foo = someFunction > $null

Проблема в том, что когда я делаю это, успешно подавляя предупреждающее сообщение, это также имеет отрицательный побочный эффект НЕ заполнения $foo результатом функции.

Как перенаправить предупреждение на $null, но оставить $foo заполненным?

Кроме того, как вы перенаправляете стандартный вывод и стандартную ошибку на ноль? (В Linux это 2>&1.)


person ted    schedule 04.05.2011    source источник
comment
Что создает предупреждающее сообщение? Если вы являетесь автором someFunction, вы можете изменить его соответствующим образом.   -  person stej    schedule 04.05.2011
comment
На самом деле в Bourne Shell (Linux) это 2>/dev/null 1>/dev/null; Показанная вами переадресация перенаправляет stderr в то же место, что и stdout, что может быть /dev/null или может быть обычным файлом.   -  person jpaugh    schedule 13.12.2016


Ответы (5)


Я бы предпочел, чтобы этот способ перенаправлял стандартный вывод (собственный PowerShell)...

($foo = someFunction) | out-null

Но это тоже работает:

($foo = someFunction) > $null

Чтобы перенаправить только стандартную ошибку после определения $foo с результатом «someFunction», выполните

($foo = someFunction) 2> $null

Это фактически то же самое, что упоминалось выше.

Или перенаправить любые стандартные сообщения об ошибках из «someFunction», а затем определить $foo с результатом:

$foo = (someFunction 2> $null)

Чтобы перенаправить оба, у вас есть несколько вариантов:

2>&1>$null
2>&1 | out-null
person J Bills    schedule 23.06.2011
comment
Это решение сработало для меня после того, как я заключил операторы в {фигурные скобки} вместо (скобки). Возможно, я использую более новую версию PS. - person ManEatingCheese; 08.09.2019
comment
И если мы создаем фоновое задание, нам нужно завершить само задание: { myCommandWithAnyOutput & } | Out-Null - person arberg; 28.09.2019

Это должно работать.

 $foo = someFunction 2>$null
person ravikanth    schedule 04.05.2011

Если вы хотите скрыть ошибки, вы можете сделать это так

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

Предупреждающие сообщения следует писать с помощью командлета Write-Warning, который позволяет подавлять предупреждающие сообщения с помощью параметра -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 предлагают аналогичные функции для соответствующих типов сообщений.

person Rynant    schedule 15.02.2012

используя функцию:

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 *.*" } }
person Elroy Flynn    schedule 18.11.2019