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).Out-File
a des problèmes avec les longues lignes dans certaines situations. Par exemple:$x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
.Out-File
a le comportement d'écraser le chemin de sortie à moins que-NoClobber
l'-Append
indicateur et / ou ne soit défini.Add-Content
ajoutera du contenu si le chemin de sortie existe déjà par défaut (si c'est possible). 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é ASCII par défaut etOut-File
créera un petit fichier encodé unicode endian par défaut.>
estunsucre syntaxiquealiaspourOut-File
. C'estOut-File
avec quelques réglages de paramètres prédéfinis.la source
echo "" > $null | Add-Content abc.txt
cela ne crée pas le fichierabc.txt
, contrairement à Out-File.Add-Content
ne reçoit donc rien. S'ilAdd-Content
ne reçoit rien, pourquoi devrait-il créer un fichier? En revanche, la même question pourrait être posée à Out-File.gci $folder | Out-File log.txt ; cat log.txt
fonctionne alors que çagci $folder | Add-Content log.txt ; cat log.txt
exploseSet-Content
son utilisation, le fichier n'est pas disponible pour les autres applications.Eh bien, je ne serais pas d'accord ... :)
donc:
et
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 une limitation très sérieuse ... Il coupera les lignes de la même manière qu'elles sont affichées. 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 du codage à utiliser.
HTH Bartek
la source
>
Out-File est la même chose. Ils appellent le même code. Tiré de PowerShell in Action Second Edition de Bruce Payette (Kindle Locations 4646):In fact, myScript > file.txt is just “syntactic sugar” for myScript | out-file -path file.txt In some cases, you’ll want to use Out-File directly because it gives you more control over the way the output is written.
>
n'est pas exactement l'équivalentout-file
. Si vous définissez$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
, il sera ignoré par>
.Set-Content
prend en charge-Encoding Byte
, tandisOut-File
que non.Ainsi, lorsque vous souhaitez écrire des données binaires ou des résultats
Text.Encoding#GetBytes()
dans un fichier, vous devez utiliserSet-Content
.la source
Out-file -append ou ">>" peut en fait mélanger deux encodages dans le même fichier. Même si le fichier est à l'origine ascii ou ansi, il ajoutera unicode par défaut au bas de celui-ci. Add-content vérifiera l'encodage et le fera correspondre avant l'ajout. Btw, export-csv prend par défaut ascii (sans accents) et set-content / add-content sur ansi.
la source