Hier ist eine Zusammenfassung dessen, was ich nach einigen Monaten Erfahrung mit PowerShell und einigen wissenschaftlichen Experimenten abgeleitet habe. Ich habe nichts davon in der Dokumentation gefunden :(
[ Update: Vieles davon scheint jetzt besser dokumentiert zu sein.]
Lese- und Schreibsperre
Während der Out-File
Ausführung kann eine andere Anwendung die Protokolldatei lesen.
Während der Set-Content
Ausführung können andere Anwendungen die Protokolldatei nicht lesen. So verwenden Sie niemalsSet-Content
langen Lauf Befehle zu protokollieren.
Codierung
Out-File
Speichert standardmäßig in der Unicode
( UTF-16LE
) - Codierung (obwohl dies angegeben werden kann), während in PowerShell 3+ Set-Content
standardmäßig ASCII
( US-ASCII
) verwendet wird (dies kann auch angegeben werden). In früheren PowerShell-Versionen wurden Set-Content
Inhalte in der Default
(ANSI-) Codierung geschrieben.
Anmerkung der Redaktion : Powershell ab Version 5.1 immer noch standardmäßig auf die kulturspezifische Default
( „ANSI“) kodiert, trotz allem , was der Dokumentation Ansprüche. Wenn ASCII die Standardeinstellung wäre, würden Nicht-ASCII-Zeichen ü
in Literal konvertiert ?
, aber das ist nicht der Fall: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
Ausbeuten $False
.
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
Dies bedeutet, dass die Standardeinstellungen von zwei Befehlen nicht kompatibel sind. Wenn Sie sie mischen, wird der Text beschädigt. Geben Sie daher immer eine Codierung an.
Formatierung
Wie Bartek erklärte, Out-File
speichert die ausgefallene Formatierung der Ausgabe, wie im Terminal zu sehen. In einem Ordner mit zwei Dateien erstellt der Befehl dir | out-file out.txt
eine Datei mit 11 Zeilen.
Während Set-Content
spart eine einfachere Darstellung. In diesem Ordner mit zwei Dateien erstellt der Befehl dir | set-content sc.txt
eine Datei mit zwei Zeilen. So emulieren Sie die Ausgabe im Terminal:
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
Ich glaube, diese Formatierung hat Konsequenzen für Zeilenumbrüche, kann sie aber noch nicht beschreiben.
Dateierstellung
Set-Content
erstellt nicht zuverlässig eine leere Datei, wenn Out-File
:
In einem leeren Ordner erstellt der Befehl dir | out-file out.txt
eine Datei, dies dir | set-content sc.txt
jedoch nicht.
Pipeline-Variable
Set-Content
nimmt den Dateinamen aus der Pipeline; So können Sie den Inhalt einer Reihe von Dateien auf einen festen Wert einstellen.
Out-File
nimmt die Daten wie aus der Pipeline; Aktualisieren des Inhalts einer einzelnen Datei.
Parameter
Set-Content
enthält die folgenden zusätzlichen Parameter:
- Ausschließen
- Filter
- Einschließen
- Durchgehen
- Strom
- UseTransaction
Out-File
enthält die folgenden zusätzlichen Parameter:
- Anhängen
- NoClobber
- Breite
Weitere Informationen zu diesen Parametern finden Sie in der Hilfe. zB get-help out-file -parameter append
.
Set-Content
Standardcodierung: übersetzt in(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ
, CurrentUICultureen-GB
, ANSICodePage1250
, OEMCodePage852
, getestet mit einer'řž'
Zeichenfolge mit verschiedenen Codes auf den obigen Codepages).Out-File
in bestimmten Situationen Probleme mit langen Schlangen auftreten. Zum Beispiel :$x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
.Out-File
hat das Verhalten, den Ausgabepfad zu überschreiben, es sei denn, das-NoClobber
und / oder das-Append
Flag ist gesetzt.Add-Content
Hängt Inhalte an, wenn der Ausgabepfad bereits standardmäßig vorhanden ist (falls möglich). Beide erstellen die Datei, falls noch keine vorhanden ist.Ein weiterer interessanter Unterschied besteht darin, dass
Add-Content
standardmäßig eine ASCII-codierte Datei und standardmäßigOut-File
eine kleine Endian-Unicode-codierte Datei erstellt wird.>
istein aliassyntaktischer Zucker fürOut-File
. Es istOut-File
mit einigen vordefinierten Parametereinstellungen.quelle
echo "" > $null | Add-Content abc.txt
es nicht die Datei erstellenabc.txt
, während Out-File würde.Add-Content
erhält also nichts. WennAdd-Content
nichts empfangen wird, warum sollte es eine Datei erstellen? Auf der anderen Seite könnte die gleiche Frage an Out-File gestellt werden.gci $folder | Out-File log.txt ; cat log.txt
während ergci $folder | Add-Content log.txt ; cat log.txt
explodiertSet-Content
die Datei während der Verwendung für andere Anwendungen nicht verfügbar ist.Nun, ich würde nicht zustimmen ... :)
so:
und
Sie erhalten völlig unterschiedliche Ergebnisse.
Und nein, '>' ist kein Alias, sondern ein Umleitungsoperator (wie in anderen Shells). Und hat sehr schwerwiegende Einschränkungen ... Es schneidet Linien auf die gleiche Weise, wie sie angezeigt werden. Out-File hat den Parameter -Width, mit dem Sie dies vermeiden können. Außerdem können Sie mit Umleitungsoperatoren nicht entscheiden, welche Codierung verwendet werden soll.
HTH Bartek
quelle
>
und Out-File dasselbe sind. Sie nennen den gleichen Code. Aus Bruce Payettes PowerShell in Aktion Zweite Ausgabe (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.
>
es nicht genau das Äquivalent gibtout-file
. Wenn Sie festlegen$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
, wird es von ignoriert>
.Set-Content
unterstützt-Encoding Byte
, währendOut-File
nicht.Wenn Sie also Binärdaten oder Ergebnisse von
Text.Encoding#GetBytes()
in eine Datei schreiben möchten , sollten Sie verwendenSet-Content
.quelle
Out-File-Append oder ">>" können tatsächlich zwei Codierungen in derselben Datei mischen. Selbst wenn die Datei ursprünglich ASCII oder Ansi ist, wird standardmäßig Unicode am unteren Rand hinzugefügt. Durch Hinzufügen von Inhalten wird die Codierung überprüft und vor dem Anhängen abgeglichen. Übrigens ist export-csv standardmäßig ascii (keine Akzente) und set-content / add-content auf ansi.
quelle