Перенаправить вывод в $ null в PowerShell, но убедиться, что переменная остается установленной - PullRequest
65 голосов
/ 04 мая 2011

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

$foo = someFunction

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

$foo = someFunction > $null

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

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

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

Ответы [ 4 ]

130 голосов
/ 24 июня 2011

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

($foo = someFunction) | out-null

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

($foo = someFunction) > $null

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

($foo = someFunction) 2> $null

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

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

$foo = (someFunction 2> $null)

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

2>&1>$null
2>&1 | out-null
11 голосов
/ 04 мая 2011

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

 $foo = someFunction 2>$null
5 голосов
/ 09 октября 2013

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

$ErrorActionPreference = "SilentlyContinue"; #This will hide errors
$someObject.SomeFunction();
$ErrorActionPreference = "Continue"; #Turning errors back on
4 голосов
/ 15 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...