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?)

 90
Author: Peter Mortensen, 2012-05-18

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.

 97
Author: Colonel Panic,
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.

 17
Author: Andy Arismendi,
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ę... :)

  1. Out-File ma-Append (- NoClober jest tam, aby uniknąć nadpisywania), które dodadzą-Content. Ale to nie jest ta sama bestia.
  2. 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

 10
Author: BartekB,
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.

 3
Author: SATO Yusuke,
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.

 0
Author: js2010,
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
 0
Author: JagWireZ,
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