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.]
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.
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.
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.
Où 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.
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.
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.
Set-Content
inclut les parameters supplémentaires suivants:
Out-File
inclut les parameters supplémentaires suivants:
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 … 🙂
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
.