Umleiten der Ausgabe in PowerShell auf $ null, aber Sicherstellen, dass die Variable festgelegt bleibt


78

Ich habe einen Code:

$foo = someFunction

Dies gibt eine Warnmeldung aus, die ich auf $ null umleiten möchte:

$foo = someFunction > $null

Das Problem ist, dass wenn ich dies tue, während die Warnmeldung erfolgreich unterdrückt wird, dies auch den negativen Nebeneffekt hat, dass $ foo NICHT mit dem Ergebnis der Funktion gefüllt wird.

Wie leite ich die Warnung auf $ null um, halte aber $ foo trotzdem gefüllt?

Wie leiten Sie sowohl die Standardausgabe als auch den Standardfehler auf Null um? (Unter Linux ist es das 2>&1.)


1
Was erzeugt die Warnmeldung? Wenn Sie der Autor von sind someFunction, können Sie es entsprechend ändern.
Stej

In Bourne Shell (Linux) ist es tatsächlich so 2>/dev/null 1>/dev/null; Die von Ihnen angezeigte Weiterleitung leitet stderr an dieselbe Stelle wie stdout weiter - /dev/nullmöglicherweise eine reguläre Datei oder eine reguläre Datei.
Jpaugh

Antworten:


149

Ich würde diese Methode bevorzugen, um die Standardausgabe (native PowerShell) umzuleiten ...

($foo = someFunction) | out-null

Das funktioniert aber auch:

($foo = someFunction) > $null

Um nur den Standardfehler umzuleiten, nachdem $ foo mit dem Ergebnis "someFunction" definiert wurde, tun Sie dies

($foo = someFunction) 2> $null

Dies ist effektiv das gleiche wie oben erwähnt.

Oder um Standardfehlermeldungen von "someFunction" umzuleiten und dann $ foo mit dem Ergebnis zu definieren:

$foo = (someFunction 2> $null)

Um beide umzuleiten, haben Sie einige Möglichkeiten:

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

Diese Lösung funktionierte für mich, nachdem ich die Anweisungen in {geschweifte Klammern} anstelle von (Klammern) eingeschlossen hatte. Ich verwende möglicherweise eine neuere PS-Version.
ManEatingCheese

Und wenn wir einen Hintergrundjob schaffen, müssen wir den Job selbst erledigen:{ myCommandWithAnyOutput & } | Out-Null
Arberg


9

Wenn Sie Fehler ausblenden möchten, können Sie dies folgendermaßen tun

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

4

Warnmeldungen sollten mit dem Write-WarningCmdlet geschrieben werden , mit dem die Warnmeldungen mit dem -WarningActionParameter oder der $WarningPreferenceautomatischen Variablen unterdrückt werden können. Eine Funktion muss verwendet werden CmdletBinding, um diese Funktion zu implementieren.

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'

Um es an der Eingabeaufforderung zu verkürzen, können Sie Folgendes verwenden -wa 0:

PS> WarningTest 'parameter alias test' -wa 0

Write-Error, Write-Verbose und Write-Debug bieten ähnliche Funktionen für die entsprechenden Nachrichtentypen.


0

mit einer Funktion:

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

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

oder wenn Sie Einzeiler mögen:

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

if (!(run_command "dir *.txt")) { if (!(run_command "dir *.doc")) { run_command "dir *.*" } }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.