Berikut ringkasan dari apa yang telah saya simpulkan, setelah pengalaman beberapa bulan dengan PowerShell, dan beberapa eksperimen ilmiah. Saya tidak pernah menemukan semua ini di dokumentasi :(
[ Pembaruan: Banyak dari ini sekarang tampaknya didokumentasikan dengan lebih baik.]
Membaca dan menulis penguncian
Saat Out-File
sedang berjalan, aplikasi lain dapat membaca file log.
Saat Set-Content
berjalan, aplikasi lain tidak dapat membaca file log. Jadi jangan pernah gunakanSet-Content
untuk mencatat perintah yang berjalan lama.
Pengkodean
Out-File
menyimpan dalam pengkodean Unicode
( UTF-16LE
) secara default (meskipun ini dapat ditentukan), sedangkan Set-Content
default ke ASCII
( US-ASCII
) dalam PowerShell 3+ (ini juga dapat ditentukan). Di versi PowerShell sebelumnya, Set-Content
menulis konten dalam Default
pengkodean (ANSI).
Catatan editor : PowerShell pada versi 5.1 masih secara default menggunakan Default
pengkodean khusus budaya ("ANSI"), terlepas dari apa yang diklaim oleh dokumentasi. Jika ASCII adalah default, karakter non-ASCII seperti ü
akan dikonversi ke literal ?
, tetapi tidak demikian: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
hasil $False
.
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
Ini berarti default dua perintah tidak kompatibel, dan mencampurkannya akan merusak teks, jadi selalu tentukan encoding.
Pemformatan
Seperti yang dijelaskan Bartek, Out-File
menyimpan format keluaran yang mewah, seperti yang terlihat di terminal. Jadi dalam folder dengan dua file, perintah dir | out-file out.txt
membuat file dengan 11 baris.
Padahal Set-Content
menyimpan representasi yang lebih sederhana. Di folder dengan dua file itu, perintah dir | set-content sc.txt
membuat file dengan dua baris. Untuk mengemulasi output di terminal:
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
Saya yakin pemformatan ini memiliki konsekuensi untuk jeda baris, tetapi saya belum bisa menjelaskannya.
Pembuatan file
Set-Content
tidak andal membuat file kosong ketika Out-File
:
Dalam folder kosong, perintah dir | out-file out.txt
membuat file, sedangkan dir | set-content sc.txt
tidak.
Variabel Pipa
Set-Content
mengambil nama file dari pipa; memungkinkan Anda untuk mengatur sejumlah konten file ke beberapa nilai tetap.
Out-File
mengambil data dari pipeline; memperbarui konten satu file.
Parameter
Set-Content
termasuk parameter tambahan berikut:
- Mengecualikan
- Saring
- Sertakan
- PassThru
- Aliran
- UseTransaction
Out-File
termasuk parameter tambahan berikut:
- Menambahkan
- NoClobber
- Lebar
Untuk informasi lebih lanjut tentang apa saja parameter tersebut, silakan merujuk ke bantuan; mis get-help out-file -parameter append
.
Set-Content
pengkodean default: diterjemahkan ke(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ
, CurrentUICultureen-GB
, ANSICodePage1250
, OEMCodePage852
, diuji menggunakan'řž'
string dengan kode berbeda di halaman kode di atas).Out-File
memiliki masalah dengan antrean panjang dalam situasi tertentu. Sebagai contoh:$x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
.Out-File
memiliki perilaku menimpa jalur keluaran kecuali jika-NoClobber
dan / atau-Append
tanda disetel.Add-Content
akan menambahkan konten jika jalur keluaran sudah ada secara default (jika bisa). Keduanya akan membuat file jika belum ada.Perbedaan menarik lainnya adalah bahwa
Add-Content
akan membuat file yang dikodekan ASCII secara default danOut-File
akan membuat file enkode unicode endian kecil secara default.>
adalahaliasgula sintaksis untukOut-File
. IniOut-File
dengan beberapa pengaturan parameter yang telah ditentukan sebelumnya.sumber
echo "" > $null | Add-Content abc.txt
itu tidak membuat fileabc.txt
, sedangkan Out-File akan.Add-Content
tidak menerima apa pun. JikaAdd-Content
tidak menerima apa-apa mengapa harus membuat file? Di sisi lain, pertanyaan yang sama dapat ditanyakan tentang Out-File.gci $folder | Out-File log.txt ; cat log.txt
bekerja saatgci $folder | Add-Content log.txt ; cat log.txt
meledakSet-Content
sedang digunakan, file tersebut tidak tersedia untuk aplikasi lain.Yah, saya tidak setuju ... :)
begitu:
dan
ls | Out-File test.txt
akan memberi Anda hasil yang sangat berbeda.
Dan tidak, '>' bukanlah alias, itu operator pengalihan (sama seperti di shell lain). Dan memiliki batasan yang sangat serius ... Ini akan memotong garis seperti yang ditampilkan. Out-File memiliki parameter -Width yang membantu Anda menghindari hal ini. Selain itu, dengan operator pengalihan, Anda tidak dapat memutuskan pengkodean apa yang akan digunakan.
HTH Bartek
sumber
>
dan Out-File adalah hal yang sama. Mereka menyebut kode yang sama. Dari Bruce Payette's PowerShell in Action Edisi Kedua (Lokasi Kindle 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.
>
tidak persis samaout-file
. Jika Anda menyetelnya$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
, ini akan diabaikan oleh>
.Set-Content
mendukung-Encoding Byte
, sementaraOut-File
tidak.Jadi ketika Anda ingin menulis data biner atau hasil
Text.Encoding#GetBytes()
ke file, Anda harus menggunakanSet-Content
.sumber
Out-file -append atau ">>" sebenarnya dapat mencampur dua pengkodean dalam file yang sama. Bahkan jika file aslinya ascii atau ansi, ini akan menambahkan unicode secara default ke bagian bawahnya. Add-content akan memeriksa encoding dan mencocokkannya sebelum menambahkan. Btw, ekspor-csv default ke ascii (tanpa aksen), dan set-content / add-content ke ansi.
sumber
Ingin menambahkan tentang perbedaan pada encoding:
Windows dengan PowerShell 5.1:
Linux dengan PowerShell 7.1:
sumber