PowerShell Set-Content et Out-File quelle est la différence?

Dans PowerShell, quelle est la différence entre Out-File et Set-Content ? Ou Add-Content et Out-File -append ?

J’ai trouvé que si j’utilisais les deux pour le même fichier, le texte est grossièrement mojibaked .

(Une seconde question mineure, > est un alias pour Out-File , non?)

Voici un résumé de ce que j’ai déduit, après quelques mois d’expérience avec Powershell et quelques expériences scientifiques. Jamais trouvé tout cela dans la documentation 🙁

[ Mise à jour: une grande partie de ceci semble maintenant être mieux documentée.]

Lecture et écriture en locking

Pendant que Out-File est en cours d’exécution, une autre application peut lire le fichier journal.

Pendant que Set-Content est en cours d’exécution, les autres applications ne peuvent pas lire le fichier journal. N’utilisez donc jamais Set-Content pour consigner des commandes longues en cours d’exécution.

Codage

Out-File enregistre par défaut (bien que cela puisse être spécifié) l’encodage Unicode ( UTF-16LE ), alors que Set-Content utilise par défaut ASCII ( US-ASCII ) dans PowerShell 3+ (cela peut également être spécifié). Dans les PowerShells antérieurs, Set-Content écrivait du contenu dans le codage Default (ANSI).

Note de l’éditeur : PowerShell, à partir de la version 5.1, utilise toujours le codage Default spécifique à la culture (“ANSI”), malgré ce que la documentation affirme. Si ASCII était la valeur par défaut, les caractères non-ASCII tels que ü seraient convertis en littéraux ? , mais ce n’est pas le cas: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?' 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?' rapporte $False .

 PS > $null | out-file outed.txt PS > $null | set-content set.txt PS > md5sum * f3b25701fe362ec84616a93a45ce9998 *outed.txt d41d8cd98f00b204e9800998ecf8427e *set.txt 

Cela signifie que les valeurs par défaut de deux commandes sont incompatibles et que leur mélange corrompra le texte, spécifiez donc toujours un encodage.

Mise en forme

Comme l’explique Bartek, Out-File enregistre le formatage sophistiqué de la sortie, comme dans le terminal. Donc, dans un dossier avec deux fichiers, la commande dir | out-file out.txt dir | out-file out.txt crée un fichier de 11 lignes.

Set-Content enregistre une représentation plus simple. Dans ce dossier avec deux fichiers, la commande dir | set-content sc.txt dir | set-content sc.txt crée un fichier avec deux lignes. Pour émuler la sortie dans le terminal:

 PS > dir | ForEach-Object {$_.ToSsortingng()} out.txt sc.txt 

Je crois que cette mise en forme a une conséquence pour les sauts de ligne, mais je ne peux pas encore la décrire.

Création de fichier

Set-Content ne crée pas de manière fiable un fichier vide lorsque Out-File :

Dans un dossier vide, la commande dir | out-file out.txt dir | out-file out.txt crée un fichier, alors que dir | set-content sc.txt dir | set-content sc.txt ne le fait pas.

Variable de pipeline

Set-Content prend le nom de fichier du pipeline; vous permettant de définir le contenu de plusieurs fichiers à une valeur fixe.

Out-File prend les données à partir du pipeline; mettre à jour le contenu d’un fichier unique.

Paramètres

Set-Content inclut les parameters supplémentaires suivants:

  • Exclure
  • Filtre
  • Comprendre
  • Passer à travers
  • Courant
  • UseTransaction

Out-File inclut les parameters supplémentaires suivants:

  • Ajouter
  • NoClobber
  • Largeur

Pour plus d’informations sur ces parameters, reportez-vous à l’aide. Par exemple, get-help out-file -parameter append .

Out-File a pour comportement d’écraser le chemin de sortie à moins que l’ -NoClobber et / ou -Append ne soit définie. Add-Content appenda du contenu si le chemin de sortie existe déjà par défaut (le cas échéant). Les deux créeront le fichier s’il n’en existe pas déjà un.

Une autre différence intéressante est que Add-Content créera un fichier encodé en ASCII par défaut et Out-File créera par défaut un petit fichier encodé en endian unicode.

> est un alias de sucre syntaxique pour Out-File . C’est Out-File avec quelques parameters prédéfinis.

Eh bien, je ne suis pas d’accord … 🙂

  1. Out-File a -Append (-NoClober est là pour éviter l’écrasement) qui appenda-contenu. Mais ce n’est pas la même bête.
  2. commande | Add-Content utilisera la méthode .ToSsortingng () en entrée. Out-File utilisera le formatage par défaut.

alors:

 ls | Add-Content test.txt 

et

 ls | Out-File test.txt 

vous donnera des résultats totalement différents.

Et non, ‘>’ n’est pas un alias, c’est un opérateur de redirection (comme dans les autres shells). Et a très grave limitation … Il va couper les lignes de la même manière qu’ils sont affichés. Out-File a le paramètre -Width qui vous aide à éviter cela. De plus, avec les opérateurs de redirection, vous ne pouvez pas décider quel encodage utiliser.

HTH Bartek

Set-Content prend en charge -Encoding Byte , alors que Out-File ne le permet pas.

Donc, lorsque vous souhaitez écrire des données binarys ou le résultat de Text.Encoding#GetBytes() dans un fichier, vous devez utiliser Set-Content .