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. Je n'ai jamais rien trouvé de cela dans la documentation :(
[ Mise à jour: une grande partie de cela semble maintenant être mieux documentée.]
Verrouillage en lecture et en écriture
Pendant l' Out-File
exécution, une autre application peut lire le fichier journal.
Pendant l' Set-Content
exécution, les autres applications ne peuvent pas lire le fichier journal. N'utilisez donc jamaisSet-Content
pour enregistrer des commandes de longue durée.
Codage
Out-File
enregistre dans le codage Unicode
( UTF-16LE
) par défaut (bien que cela puisse être spécifié), alors que la valeur par Set-Content
défaut est ASCII
( US-ASCII
) dans PowerShell 3+ (cela peut également être spécifié). Dans les versions antérieures de PowerShell, Set-Content
rédigeait le contenu dans le Default
codage (ANSI).
Note de l'éditeur : PowerShell à partir de la version 5.1 utilise toujours le Default
codage 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éral ?
, mais ce n'est pas le cas: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
renvoie $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 les mélanger endommagera le texte, alors spécifiez toujours un encodage.
Mise en page
Comme Bartek l'a expliqué, Out-File
enregistre le formatage sophistiqué de la sortie, comme on le voit dans le terminal. Ainsi, dans un dossier avec deux fichiers, la commande dir | out-file out.txt
crée un fichier avec 11 lignes.
Alors que Set-Content
enregistre une représentation plus simple. Dans ce dossier avec deux fichiers, la commande dir | set-content sc.txt
crée un fichier avec deux lignes. Pour émuler la sortie dans le terminal:
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
Je pense que ce formatage a une conséquence sur les sauts de ligne, mais je ne peux pas encore le décrire.
Création de fichier
Set-Content
ne crée pas de manière fiable un fichier vide quand Out-File
:
Dans un dossier vide, la commande dir | out-file out.txt
crée un fichier, mais dir | set-content sc.txt
pas.
Variable de pipeline
Set-Content
prend le nom de fichier du pipeline; vous permettant de définir le contenu d'un certain nombre de fichiers sur une valeur fixe.
Out-File
prend les données à partir du pipeline; mettre à jour le contenu d'un seul fichier.
Paramètres
Set-Content
comprend les paramètres supplémentaires suivants:
- Exclure
- Filtre
- Comprendre
- Passer à travers
- Courant
- UtiliserTransaction
Out-File
comprend les paramètres supplémentaires suivants:
- Ajouter
- NoClobber
- Largeur
Pour plus d'informations sur ces paramètres, reportez-vous à l'aide; par exemple get-help out-file -parameter append
.
Set-Content
encodage par défaut: traduit en(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ
, CurrentUICultureen-GB
, ANSICodePage1250
, OEMCodePage852
, testé en utilisant une'řž'
chaîne avec différents codes dans les pages de codes ci-dessus).