Oto podsumowanie tego, co wydedukowałem po kilku miesiącach doświadczeń z PowerShell i kilku eksperymentach naukowych. Nigdy nie znalazłem tego w dokumentacji :(
[ Aktualizacja: większość z tego wydaje się być teraz lepiej udokumentowana.]
Odczyt i zapis blokowania
Podczas Out-File
działania inna aplikacja może odczytać plik dziennika.
Podczas Set-Content
działania inne aplikacje nie mogą odczytać pliku dziennika. Dlatego nigdy nie używajSet-Content
do rejestrowania długo działających poleceń.
Kodowanie
Out-File
zapisuje w kodowaniu Unicode
( UTF-16LE
) domyślnie (chociaż można to określić), podczas gdy Set-Content
domyślnie jest to ASCII
( US-ASCII
) w PowerShell 3+ (można to również określić). We wcześniejszych wersjach programu PowerShell Set-Content
zapisano zawartość w Default
kodowaniu (ANSI).
Uwaga edytora : PowerShell od wersji 5.1 nadal domyślnie korzysta z Default
kodowania specyficznego dla kultury („ANSI”), pomimo tego, co twierdzi dokumentacja. Gdyby wartość ASCII była domyślna, znaki inne niż ASCII, takie jak, ü
zostałyby przekonwertowane na literał ?
, ale tak nie jest : 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
yields $False
.
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
Oznacza to, że wartości domyślne dwóch poleceń są niekompatybilne, a mieszanie ich spowoduje uszkodzenie tekstu, dlatego zawsze określaj kodowanie.
Formatowanie
Jak wyjaśnił Bartek, Out-File
zapisuje fantazyjne formatowanie wyjścia, jak widać na terminalu. Tak więc w folderze z dwoma plikami polecenie dir | out-file out.txt
tworzy plik z 11 wierszami.
Natomiast Set-Content
zapisuje prostszą reprezentację. W tym folderze z dwoma plikami polecenie dir | set-content sc.txt
tworzy plik z dwoma wierszami. Aby emulować wyjście w terminalu:
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
Uważam, że to formatowanie ma wpływ na podziały wierszy, ale nie mogę tego jeszcze opisać.
Tworzenie plików
Set-Content
nie tworzy niezawodnie pustego pliku, gdy Out-File
:
W pustym folderze polecenie dir | out-file out.txt
tworzy plik, a dir | set-content sc.txt
nie.
Zmienna rurociągu
Set-Content
pobiera nazwę pliku z potoku; pozwalając na ustawienie pewnej stałej wartości wielu plików.
Out-File
pobiera dane z rurociągu; aktualizacja zawartości pojedynczego pliku.
Parametry
Set-Content
zawiera następujące dodatkowe parametry:
- Wykluczać
- Filtr
- Zawierać
- Przejść przez
- Strumień
- UseTransaction
Out-File
zawiera następujące dodatkowe parametry:
- Dodać
- NoClobber
- Szerokość
Więcej informacji na temat tych parametrów można znaleźć w pomocy; np get-help out-file -parameter append
.
Set-Content
domyślne kodowanie: przetłumaczone na(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ
, CurrentUICultureen-GB
, ANSICodePage1250
, OEMCodePage852
, testowane przy użyciu'řž'
ciągu z różnymi kodami na powyższych stronach kodowych).