about_Redirection

Description courte

Explique comment rediriger la sortie de PowerShell vers des fichiers texte.

Description longue

Par défaut, PowerShell envoie la sortie à l’hôte PowerShell. Il s’agit généralement de l’application console. Toutefois, vous pouvez rediriger la sortie vers un fichier texte et vous pouvez rediriger la sortie d’erreur vers le flux de sortie normal.

Vous pouvez utiliser les méthodes suivantes pour rediriger la sortie :

  • Utilisez l' Out-File applet de commande, qui envoie une sortie de commande à un fichier texte. En général, vous utilisez l’applet de commande Out-File lorsque vous avez besoin d’utiliser ses paramètres, tels que les Encoding paramètres,, Force Width ou NoClobber .

  • Utilisez l' Tee-Object applet de commande, qui envoie une sortie de commande à un fichier texte, puis l’envoie au pipeline.

  • Utilisez les opérateurs de redirection PowerShell. L’utilisation de l’opérateur de redirection avec une cible de fichier est fonctionnellement équivalente à la fonctionnalité de canalisation Out-File sans aucun paramètre supplémentaire.

Pour plus d’informations sur les flux, consultez about_Output_Streams.

Flux de sortie redirigés

PowerShell prend en charge la redirection des flux de sortie suivants.

Train # Description Introduite dans Écrire l’applet de commande
1 Opération réussie Train PowerShell 2.0 Write-Output
2 Erreur Train PowerShell 2.0 Write-Error
3 Avertissement Train PowerShell 3.0 Write-Warning
4 Commentaires Train PowerShell 3.0 Write-Verbose
5 Débogage Train PowerShell 3.0 Write-Debug
6 Informations Train PowerShell 5.0 Write-Information
* Toutes les Flux PowerShell 3.0

Il y a également un flux de progression dans PowerShell, mais il ne prend pas en charge la redirection.

Important

Les flux de réussite et d' erreur sont similaires aux flux STDOUT et stderr d’autres shells. Toutefois, stdin n’est pas connecté au pipeline PowerShell pour l’entrée.

Opérateurs de redirection PowerShell

Les opérateurs de redirection PowerShell sont les suivants, où n représente le numéro de flux. Le flux de réussite ( 1 ) est la valeur par défaut si aucun flux n’est spécifié.

Opérateur Description Syntaxe
> Envoie le flux spécifié à un fichier. n>
>> Ajoute le flux spécifié à un fichier. n>>
>&1 Redirige le flux spécifié vers le flux de réussite . n>&1

Notes

Contrairement à certains shells UNIX, vous pouvez rediriger uniquement les autres flux vers le flux de réussite .

Exemples

Exemple 1 : rediriger les erreurs et la sortie vers un fichier

Cet exemple s’exécute dir sur un élément qui sera correctement exécuté, et sur un élément qui génère une erreur.

dir 'C:\', 'fakepath' 2>&1 > .\dir.log

Il utilise 2>&1 pour rediriger le flux d' Erreurs vers le flux de réussite , et > pour envoyer le flux de réussite obtenu à un fichier appelé dir.log

Exemple 2 : envoyer toutes les données de flux de réussite à un fichier

Cet exemple envoie toutes les données de flux de réussite à un fichier appelé script.log .

.\script.ps1 > script.log

Exemple 3 : envoyer des flux de réussite, d’avertissement et d’erreur à un fichier

Cet exemple montre comment combiner des opérateurs de redirection pour obtenir le résultat souhaité.

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1 redirige le flux d' Avertissement vers le flux de réussite .
  • 2>&1 redirige le flux d' Erreurs vers le flux de réussite (qui contient également toutes les données de flux d' Avertissement )
  • > redirige le flux de réussite (qui contient désormais à la fois des flux d' avertissements et d' Erreurs ) vers un fichier appelé C:\temp\redirection.log )

Exemple 4 : rediriger tous les flux vers un fichier

Cet exemple envoie tous les flux de sortie à partir d’un script appelé script.ps1 dans un fichier appelé script.log

.\script.ps1 *> script.log

Exemple 5 : supprimer toutes les données de flux de Write-Host et d’informations

Cet exemple supprime toutes les données de flux d’informations. Pour en savoir plus sur les applets de commande de flux d' informations , consultez Write-Host et Write-information .

&{
   Write-Host "Hello"
   Write-Information "Hello" -InformationAction Continue
} 6> $null

Exemple 6 : afficher l’effet des préférences d’action

Les paramètres et les variables de préférence d’action peuvent modifier ce qui est écrit dans un flux de données particulier. Le script de cet exemple montre comment la valeur de $ErrorActionPreference affecte ce qui est écrit dans le flux d' Erreurs .

$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
    get-item /not-here 2>&1 >> log.txt
}
catch {
    "`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Continue'

Lorsque nous exécutons ce script, nous recevons une invite quand $ErrorActionPreference a la valeur Inquire .

PS C:\temp> .\test.ps1

Confirm
Cannot find path 'C:\not-here' because it does not exist.
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
  23 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The running command stopped because the user selected the Stop option.

Lorsque nous examinons le fichier journal, nous voyons ce qui suit :

PS C:\temp> Get-Content .\log.txt
Continue

Get-Item: C:\temp\test.ps1:3
Line |
   3 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot find path 'C:\not-here' because it does not exist.

SilentlyContinue
Stop
    Error caught!
Ignore
Inquire

Notes

Les opérateurs de redirection qui n’ajoutent pas de données ( > et n> ) remplacent le contenu actuel du fichier spécifié sans avertissement.

Toutefois, si le fichier est un fichier système, masqué et en lecture seule, la redirection échoue. Les opérateurs de redirection d’ajout ( >> et n>> ) n’écrivent pas dans un fichier en lecture seule, mais ils ajoutent du contenu à un fichier système ou masqué.

Pour forcer la redirection du contenu vers un fichier système, masqué ou en lecture seule, utilisez l' Out-File applet de commande avec son Force paramètre.

Lorsque vous écrivez dans des fichiers, les opérateurs de redirection utilisent l' UTF8NoBOM encodage. Si le fichier a un encodage différent, il est possible que la sortie ne soit pas correctement mise en forme. Pour écrire dans des fichiers avec un encodage différent, utilisez l' Out-File applet de commande avec son Encoding paramètre.

Largeur de sortie lors de l’écriture dans un fichier

Lorsque vous écrivez dans un fichier à l’aide de Out-File ou des opérateurs de redirection, PowerShell met en forme la sortie du tableau dans le fichier en fonction de la largeur de la console dans laquelle il s’exécute. Par exemple, lors de l’enregistrement de la sortie de table dans un fichier à l’aide d’une commande telle que Get-ChildItem Env:\Path > path.log sur un système où la largeur de console est définie sur 80 colonnes, la sortie dans le fichier est tronquée à 80 caractères :

Name                         Value
----                         -----
Path                         C:\Program Files\PowerShell\7-preview;C:\WINDOWS…

Sachant que la largeur de la console peut être définie de façon arbitraire sur les systèmes où votre script est exécuté, vous pouvez préférer que la sortie de la table de format PowerShell s’appuie sur une largeur que vous spécifiez à la place.

L' Out-File applet de commande fournit un paramètre de largeur qui vous permet de définir la largeur que vous souhaitez pour la sortie de table. Plutôt que d’avoir à ajouter -Width 2000 partout où vous appelez Out-File , vous pouvez utiliser la $PSDefaultParameterValues variable pour définir cette valeur pour toutes les utilisations de l’applet de commande Out-File dans un script. Et étant donné que les opérateurs de redirection ( > et >> ) sont des alias efficaces pour Out-File , la définition du Out-File:Width paramètre pour l’ensemble du script affecte également la largeur de mise en forme pour les opérateurs de redirection. Placez la commande suivante dans la partie supérieure de votre script pour définir Out-File:Width pour l’ensemble du script :

$PSDefaultParameterValues['out-file:width'] = 2000

L’augmentation de la largeur de sortie augmente la consommation de mémoire lors de la journalisation de la sortie au format table. Si vous consignez une grande quantité de données tabulaires dans un fichier et que vous savez que vous pouvez obtenir avec une plus petite largeur, utilisez la plus petite largeur.

Dans certains cas, tels que Get-Service la sortie, afin d’utiliser la largeur supplémentaire, vous devez diriger la sortie vers Format-Table -AutoSize avant de sortir du fichier.

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

Pour plus d’informations sur $PSDefaultParameterValues , consultez about_Preference_Variables.

Confusion potentielle avec les opérateurs de comparaison

L' > opérateur ne doit pas être confondu avec l’opérateur de comparaison supérieur à (souvent désigné comme > dans d’autres langages de programmation).

Selon les objets comparés, la sortie à l’aide de > peut sembler correcte (car 36 n’est pas supérieur à 42).

PS> if (36 > 42) { "true" } else { "false" }
false

Toutefois, une vérification du système de fichiers local peut voir qu’un fichier appelé 42 a été écrit avec le contenu 36 .

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

Toute tentative d’utilisation de la comparaison inverse < (inférieure à) génère une erreur système :

PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

Si la comparaison numérique est l’opération requise, elle -lt -gt doit être utilisée. Pour plus d’informations, consultez l' -gt opérateur dans about_Comparison_Operators.

Voir aussi