Перенаправлення виводу на $ null у PowerShell, але забезпечення змінної залишається встановленим


83

У мене є код:

$foo = someFunction

Це виведе попереджувальне повідомлення, яке я хочу перенаправити на $ null:

$foo = someFunction > $null

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

Як мені перенаправити попередження на $ null, але при цьому залишити $ foo заповненим?

Крім того, як ви перенаправляєте як стандартний вивід, так і стандартну помилку на нуль? (У Linux це 2>&1.)


1
Що видає попереджувальне повідомлення? Якщо ви є автором someFunction, ви можете відповідним чином змінити його.
stej

Насправді в Bourne Shell (Linux) це 2>/dev/null 1>/dev/null; Переспрямування, яке ви показали, перенаправляє stderr туди ж, де і stdout - це може бути /dev/nullабо може бути звичайним файлом.
jpaugh

Відповіді:


153

Я віддав би перевагу цьому способу перенаправити стандартний вивід (рідний 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

Це рішення спрацювало для мене після того, як я загорнув твердження у {фігурні дужки} замість (у дужки). Можливо, я використовую новішу версію PS.
ManEatingCheese

І якщо ми створюємо фонову роботу, нам потрібно цілком виконати цю роботу:{ myCommandWithAnyOutput & } | Out-Null
Арберг,


10

Якщо ви хочете приховати помилки, ви можете зробити це так

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

4

Попереджувальні повідомлення слід писати за допомогою 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

Помилка записування, детальний запис та налагодження записів пропонують подібні функції для відповідних типів повідомлень.


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 *.*" } }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.