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).Out-File
w niektórych sytuacjach ma problemy z długimi kolejkami. Na przykład:$x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
.Out-File
zachowuje się nadpisując ścieżkę wyjściową, chyba że ustawiono flagę-NoClobber
i / lub-Append
.Add-Content
doda zawartość, jeśli ścieżka wyjściowa już istnieje domyślnie (jeśli może). Obie utworzą plik, jeśli jeszcze nie istnieje.Inną interesującą różnicą jest to, że
Add-Content
domyślnieOut-File
utworzy plik zakodowany w ASCII i domyślnie utworzy plik z kodowaniem little endian Unicode.>
toaliassyntactic sugar forOut-File
. JestOut-File
z kilkoma wstępnie zdefiniowanymi ustawieniami parametrów.źródło
echo "" > $null | Add-Content abc.txt
, nie utworzysz plikuabc.txt
, podczas gdy Out-File to zrobi.Add-Content
nic nie otrzymuje. JeśliAdd-Content
nie otrzyma niczego, dlaczego miałby utworzyć plik? Z drugiej strony to samo pytanie można by zadać Out-File.gci $folder | Out-File log.txt ; cat log.txt
działa natomiastgci $folder | Add-Content log.txt ; cat log.txt
wysadzaSet-Content
używania plik jest niedostępny dla innych aplikacji.Cóż, nie zgodziłbym się ... :)
więc:
i
ls | Out-File test.txt
da zupełnie inne rezultaty.
I nie, „>” nie jest aliasem, jest operatorem przekierowania (tak samo jak w innych powłokach). I ma bardzo poważne ograniczenia ... Będzie wycinać linie w taki sam sposób, w jaki są wyświetlane. Out-File ma parametr -Width, który pomaga tego uniknąć. Ponadto w przypadku operatorów przekierowania nie możesz zdecydować, jakiego kodowania użyć.
HTH Bartek
źródło
>
i Out-File to to samo. Nazywają ten sam kod. Z programu PowerShell w akcji Bruce'a Payette'a Wydanie drugie (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.
>
nie jest dokładnym odpowiednikiemout-file
. Jeśli ustawisz$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
, zostanie zignorowany przez>
.Set-Content
obsługuje-Encoding Byte
, aOut-File
nie.Więc jeśli chcesz zapisać dane binarne lub wynik
Text.Encoding#GetBytes()
do pliku, powinieneś użyćSet-Content
.źródło
Out-file -append lub „>>” może w rzeczywistości mieszać dwa kodowania w tym samym pliku. Nawet jeśli pierwotnie plik jest ascii lub ansi, domyślnie doda unicode na dole. Add-content sprawdzi kodowanie i dopasuje je przed dołączeniem. Btw, export-csv domyślnie ustawia ascii (bez akcentów), a set-content / add-content na ansi.
źródło
Chciałem dodać różnicę w kodowaniu:
Windows z PowerShell 5.1:
Linux z PowerShell 7.1:
źródło