106 votes

Rediriger l'entrée/sortie standard dans Windows PowerShell

Quelle est la syntaxe requise pour rediriger l'entrée/sortie standard sur Windows PowerShell ?

Sous Unix, nous utilisons :

$./program output.txt

Comment exécuter la même tâche dans PowerShell ?

126voto

JasonMArcher Points 4662

Vous ne pouvez pas connecter directement un fichier à stdin, mais vous pouvez toujours accéder à stdin.

Get-Content input.txt | ./program > output.txt

33voto

tscissors Points 99

Si quelqu'un recherche une alternative à 'Get-Content' pour les gros fichiers (comme moi), vous pouvez utiliser CMD dans PowerShell:

cmd.exe /c ".\program < .\input.txt"

Ou vous pouvez utiliser cette commande PowerShell:

Start-Process .\program.exe -RedirectStandardInput .\input.txt -NoNewWindow -Wait

Il exécutera le programme de manière synchrone dans la même fenêtre. Mais je n'ai pas réussi à savoir comment écrire le résultat de cette commande dans une variable lorsque je l'exécute dans un script PowerShell car il écrit toujours les données dans la console.

MODIFIER:

Pour obtenir la sortie de Start-Process, vous pouvez utiliser l'option

-RedirectStandardOutput

pour rediriger la sortie vers un fichier et ensuite le lire à partir du fichier:

Start-Process ".\program.exe" -RedirectStandardInput ".\input.txt" -RedirectStandardOutput ".\temp.txt" -NoNewWindow -Wait
$Result = Get-Content ".\temp.txt"

10voto

iSamnium Points 376

Pour la redirection de sortie, vous pouvez utiliser :

  command >  filename      Rediriger la sortie de la commande vers un fichier (écraser)

  command >> filename      AJOUTER dans un fichier

  command 2> filename      Rediriger les erreurs

La redirection d'entrée fonctionne d'une manière différente. Par exemple, voir cette Cmdlet http://technet.microsoft.com/en-us/library/ee176843.aspx

5voto

Damir Points 43

Ou vous pouvez faire :

quelque chose comme :

$proc = Start-Process "my.exe" "arguments de ligne de commande exe" -PassThru -wait -NoNewWindow -RedirectStandardError "chemin vers le fichier d'erreur" -redirectstandardinput "chemin vers un fichier d'où provient l'entrée"

si vous voulez savoir si le processus a généré une erreur, ajoutez le code suivant :

$exitCode = $proc.get_ExitCode()

if ($exitCode){
    $errItem = Get-Item "chemin vers le fichier d'erreur"
    if ($errItem.length -gt 0){
        $errors = Get-Content "chemin vers le fichier d'erreur" | Out-String
    }
}

Je trouve que de cette façon, j'ai une meilleure maîtrise de l'exécution de vos scripts lorsque vous avez besoin de gérer un programme/processus externe. Sinon, j'ai rencontré des situations où le script restait bloqué sur certaines erreurs de processus externes.

3voto

js2010 Points 823

Vous pouvez également le faire pour que les erreurs standard et la sortie standard aillent au même endroit (notez que dans cmd, 2>&1 doit être dernier):

get-childitem foo 2>&1 >log

Remarquez que ">" est équivalent à "| out-file", et par défaut l'encodage est unicode ou utf 16. Faites également attention avec ">>", car cela peut mélanger ascii et unicode dans le même fichier texte. "| add-content" fonctionne probablement mieux que ">>". "| set-content" pourrait être préférable à ">".

Il y a maintenant 6 flux. Plus d'informations: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-5.1

Je pense que tout ce que vous pouvez faire est d'enregistrer dans un fichier texte puis de le lire dans une variable par la suite.

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