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.)

ted
quelle
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
J Rechnungen
quelle
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
12

Das sollte funktionieren.

 $foo = someFunction 2>$null
Ravikanth
quelle
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
Christian Flem
quelle
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.

Rynant
quelle
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 *.*" } }
Elroy Flynn
quelle