PowerShell Set-Content and Out-File-jaka jest różnica?
W PowerShell, jaka jest różnica między Out-File
i Set-Content
? Lub Add-Content
i Out-File -append
?
Odkryłem, że jeśli użyję obu przeciwko temu samemu plikowi, tekst jest w pełni mojibaked.
(Małe drugie pytanie: >
jest aliasem dla Out-File
, prawda?)
6 answers
Oto podsumowanie tego, co wydedukowałem, po kilku miesiącach doświadczeń z PowerShell i eksperymentach naukowych. Nigdy nie znalazłem nic z tego w dokumentacji: ([32]}
[Aktualizacja: wiele z tego wydaje się być lepiej udokumentowane.]
Blokowanie odczytu i zapisu
Podczas działania Out-File
inna aplikacja może odczytać plik dziennika.
Podczas działania Set-Content
inne aplikacje nie mogą odczytać pliku dziennika. Tak więc nigdy nie używaj Set-Content
aby rejestrować długie uruchomione polecenia.
Kodowanie
Out-File
oszczędza w Unicode
(UTF-16LE
) kodowanie domyślnie (choć można to określić), natomiast Set-Content
domyślnie:ASCII
(US-ASCII
) W PowerShell 3+ (można to również określić). We wcześniejszych wersjach PowerShell, Set-Content
napisał treść w Default
(ANSI) kodowanie.
Uwaga wydawcy : PowerShell od wersji 5.1 nadal domyślnie kodowanie specyficzne dla kultury Default
("ANSI"), pomimo tego, co twierdzi dokumentacja. Jeśli ASCII byłoby domyślne, znaki inne niż ASCII, takie jak ü
, zostałyby przekonwertowane na literał ?
, ale to jest nie przypadek: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
daje $False
.
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
Oznacza to, że domyślne dwa polecenia są niezgodne, a ich wymieszanie spowoduje uszkodzenie tekstu, więc zawsze należy podać kodowanie.
Formatowanie
Jak wyjaśnił Bartek, Out-File
ratuje fantazję formatowanie wyjścia, jak widać w terminalu. Tak więc w folderze z dwoma plikami, polecenie dir | out-file out.txt
tworzy plik z 11 liniami.
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
Wierzę, że to formatowanie ma konsekwencje dla podziałów linii, ale nie mogę go jeszcze opisać.
Tworzenie plików
Set-Content
nie tworzy niezawodnie pustego file when Out-File
would:
W pustym folderze polecenie dir | out-file out.txt
tworzy plik, natomiast dir | set-content sc.txt
nie.
Zmienna Rurociągu
Set-Content
pobiera nazwę pliku z potoku; pozwala ustawić zawartość wielu plików na pewną stałą wartość.
Out-File
pobiera dane z potoku; aktualizuje zawartość pojedynczego pliku.
Parametry
Set-Content
zawiera następujące dodatkowe parametry:
- Exclude
- Filtr
- Include
- Passtru
- strumień
- UseTransaction
Out-File
zawiera następujące dodatkowe parametry:
- Append
- NoClobber
- Width
Więcej informacji na temat tych parametrów można znaleźć w pomocy, np. get-help out-file -parameter append
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-15 18:10:25
Out-File
mA zachowanie nadpisywania ścieżki wyjściowej, chyba że ustawiono znacznik -NoClobber
i/lub -Append
. Add-Content
doda zawartość, jeśli ścieżka wyjściowa już istnieje domyślnie (jeśli może). Oba utworzą plik, jeśli taki jeszcze nie istnieje.
Inną ciekawą różnicą jest to, że Add-Content
domyślnie utworzy plik zakodowany w ASCII, A Out-File
domyślnie utworzy mały endiański plik zakodowany w unicode.
>
jest aliasem składniowym dla Out-File
. On Out-File
z wstępnie zdefiniowanymi ustawieniami parametrów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-18 20:40:13
Nie zgadzam się... :)
- Out-File ma-Append (- NoClober jest tam, aby uniknąć nadpisywania), które dodadzą-Content. Ale to nie jest ta sama bestia.
- użyje polecenia / Add-Content .Metoda ToString() na wejściu. Out-File użyje domyślnego formatowania.
Więc:
ls | Add-Content test.txt
I
ls | Out-File test.txt
Da Ci zupełnie inne wyniki.
I nie, ' > ' nie jest aliasem, to operator przekierowania(taki sam jak w innych powłokach). I ma bardzo poważne ograniczenie... Tnie linie w ten sam sposób, w jaki są wyświetlane. Out-File ma parametr-Width, który pomaga tego uniknąć. Ponadto w przypadku operatorów przekierowań nie możesz zdecydować, jakiego kodowania użyć.
HTH Bartek
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-18 18:43:48
Set-Content
obsługuje -Encoding Byte
, natomiast Out-File
nie.
Więc jeśli chcesz zapisać dane binarne lub wynik Text.Encoding#GetBytes()
do pliku, powinieneś użyć Set-Content
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 15:17:17
Out-file-append lub "> > " może mieszać dwa kodowania w tym samym pliku. Nawet jeśli plik jest pierwotnie ascii lub ansi, domyślnie doda unicode do jego dolnej części. Add-content sprawdzi kodowanie i dopasuje je przed dodaniem. Btw, export-csv domyślnie ASCII (bez akcentów), i set-content/add-content do ansi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-11 00:41:52
Chciałem dodać o różnicy w kodowaniu:
Windows z PowerShell 5.1:
- Out-File-domyślne kodowanie to utf-16LE
- Set-Content - domyślne kodowanie to us-ascii
Linux z PowerShell 7.1:
- Out-File - domyślne kodowanie to us-ascii
- Set-Content - domyślne kodowanie to us-ascii
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-20 11:14:54