123 votes

Redirection de la sortie vers $null dans PowerShell, mais en s'assurant que la variable reste définie

J'ai un peu de code :

$foo = someFunction

Cela produit un message d'avertissement que je veux rediriger vers $null :

$foo = someFunction > $null

Le problème est que lorsque je fais cela, tout en supprimant avec succès le message d'avertissement, cela a aussi l'effet secondaire négatif de NE PAS remplir $foo avec le résultat de la fonction.

Comment rediriger l'avertissement vers $null, tout en gardant $foo renseigné ?

Par ailleurs, comment rediriger la sortie standard et l'erreur standard vers null (sous Linux, c'est 2>&1 .)

209voto

J Bills Points 291

Je préférerais cette façon de rediriger la sortie standard (PowerShell natif)...

($foo = someFunction) | out-null

Mais cela fonctionne aussi :

($foo = someFunction) > $null

Pour rediriger l'erreur standard après avoir défini $foo avec le résultat de "someFunction", faites

($foo = someFunction) 2> $null

Il s'agit en fait de la même chose que celle mentionnée ci-dessus.

Ou pour rediriger les messages d'erreur standard de "someFunction" et définir $foo avec le résultat :

$foo = (someFunction 2> $null)

Pour réorienter les deux, plusieurs options s'offrent à vous :

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

ADDENDUM :

Veuillez noter que Windows powershell a beaucoup plus de flux qu'un système d'exploitation basé sur Linux. Voici le flux liste tirée de la documentation de MS :

enter image description here

Vous pouvez donc rediriger tous en utilisant le caractère générique avec *>$null Vous pouvez également utiliser un fichier au lieu de $null .

16voto

ravikanth Points 9573

Cela devrait fonctionner.

 $foo = someFunction 2>$null

15voto

user1545314 Points 111

Si ce sont des erreurs que vous voulez cacher, vous pouvez procéder comme suit

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

6voto

Rynant Points 6575

Les messages d'avertissement doivent être rédigés à l'aide de la fonction Write-Warning qui permet de supprimer les messages d'avertissement à l'aide de la cmdlet -WarningAction ou le paramètre $WarningPreference variable automatique. Une fonction doit utiliser CmdletBinding pour mettre en œuvre cette fonctionnalité.

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'

Pour le raccourcir à l'invite de commande, vous pouvez utiliser -wa 0 :

PS> WarningTest 'parameter alias test' -wa 0

Write-Error, Write-Verbose et Write-Debug offrent des fonctionnalités similaires pour les types de messages correspondants.

1voto

Elroy Flynn Points 998

En utilisant une fonction :

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

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

ou si vous aimez les répliques :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X