about_Redirection
Deskripsi singkat
Menjelaskan cara mengalihkan output dari PowerShell ke file teks.
Deskripsi panjang
Secara default, PowerShell mengirim output ke host PowerShell. Biasanya ini adalah aplikasi konsol. Namun, Anda dapat mengalihkan output ke file teks dan Anda dapat mengalihkan output kesalahan ke aliran output reguler.
Anda dapat menggunakan metode berikut untuk mengalihkan output:
Out-File
Gunakan cmdlet, yang mengirim output perintah ke file teks. Biasanya, Anda menggunakanOut-File
cmdlet ketika Anda perlu menggunakan parameternya, sepertiEncoding
parameter , ,Force
Width
, atauNoClobber
.Tee-Object
Gunakan cmdlet, yang mengirim output perintah ke file teks lalu mengirimkannya ke alur.Gunakan operator pengalihan PowerShell. Mengalihkan output perintah PowerShell (cmdlet, fungsi, skrip) menggunakan operator pengalihan (
>
) secara fungsional setara dengan pipa denganOut-File
tanpa parameter tambahan. PowerShell 7.4 mengubah perilaku operator pengalihan saat digunakan untuk mengalihkan aliran stdout perintah asli.
Untuk informasi selengkapnya tentang aliran, lihat about_Output_Aliran.
Aliran output yang dapat dialihkan
PowerShell mendukung pengalihan aliran output berikut.
Stream # | Deskripsi | Diperkenalkan di | Tulis Cmdlet |
---|---|---|---|
1 | Aliran Keberhasilan | PowerShell 2.0 | Write-Output |
2 | Aliran Kesalahan | PowerShell 2.0 | Write-Error |
3 | Aliran Peringatan | PowerShell 3.0 | Write-Warning |
4 | Aliran Verbose | PowerShell 3.0 | Write-Verbose |
5 | Aliran Debug | PowerShell 3.0 | Write-Debug |
6 | Aliran Informasi | PowerShell 5.0 | Write-Information , Write-Host |
* | Semua Aliran | PowerShell 3.0 |
Ada juga aliran Kemajuan di PowerShell, tetapi tidak mendukung pengalihan.
Penting
Aliran Keberhasilan dan Kesalahan mirip dengan aliran stdout dan stderr dari shell lain. Namun, stdin tidak tersambung ke alur PowerShell untuk input.
Operator pengalihan PowerShell
Operator pengalihan PowerShell adalah sebagai berikut, di mana n
mewakili nomor aliran. Aliran Berhasil ( 1
) adalah default jika tidak ada aliran yang ditentukan.
Operator | Deskripsi | Sintaks |
---|---|---|
> |
Kirim aliran yang ditentukan ke file. | n> |
>> |
Tambahkan aliran yang ditentukan ke file. | n>> |
>&1 |
Mengalihkan aliran yang ditentukan ke aliran Berhasil . | n>&1 |
Catatan
Tidak seperti beberapa shell Unix, Anda hanya dapat mengalihkan aliran lain ke aliran Berhasil .
Mengalihkan output dari perintah asli
PowerShell 7.4 mengubah perilaku operator pengalihan saat digunakan untuk mengalihkan aliran stdout dari perintah asli. Operator pengalihan sekarang mempertahankan data byte-stream saat mengalihkan output dari perintah asli. PowerShell tidak menginterpretasikan data yang dialihkan atau menambahkan pemformatan tambahan apa pun. Untuk informasi selengkapnya, lihat Contoh #7.
Contoh
Contoh 1: Mengalihkan kesalahan dan output ke file
Contoh ini berjalan dir
pada satu item yang berhasil, dan yang gagal.
dir C:\, fakepath 2>&1 > .\dir.log
Ini menggunakan 2>&1
untuk mengalihkan aliran Kesalahan ke aliran Keberhasilan, dan >
untuk mengirim aliran Keberhasilan yang dihasilkan ke file yang disebutdir.log
Contoh 2: Mengirim semua data aliran Keberhasilan ke file
Contoh ini mengirimkan semua data stream Keberhasilan ke file yang disebut script.log
.
.\script.ps1 > script.log
Contoh 3: Mengirim aliran Berhasil, Peringatan, dan Kesalahan ke file
Contoh ini menunjukkan bagaimana Anda dapat menggabungkan operator pengalihan untuk mencapai hasil yang diinginkan.
&{
Write-Warning "hello"
Write-Error "hello"
Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
3>&1
mengalihkan aliran Peringatan ke aliran Berhasil .2>&1
mengalihkan aliran Kesalahan ke aliran Keberhasilan (yang juga sekarang menyertakan semua data aliran Peringatan )>
mengalihkan aliran Berhasil (yang sekarang berisi aliran Peringatan dan Kesalahan ) ke file yang disebutC:\temp\redirection.log
.
Contoh 4: Mengalihkan semua aliran ke file
Contoh ini mengirimkan semua output aliran dari skrip yang disebut script.ps1
ke file yang disebut script.log
.
.\script.ps1 *> script.log
Contoh 5: Menekan semua data aliran Write-Host dan Information
Contoh ini menekan semua data aliran informasi. Untuk membaca selengkapnya tentang cmdlet aliran Informasi , lihat Write-Host dan Write-Information
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
Contoh 6: Menampilkan efek Preferensi Tindakan
Variabel dan parameter Preferensi Tindakan dapat mengubah apa yang ditulis ke aliran tertentu. Skrip dalam contoh ini menunjukkan bagaimana nilai $ErrorActionPreference
memengaruhi apa yang ditulis ke aliran Kesalahan .
$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
get-item /not-here 2>&1 >> log.txt
}
catch {
"`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Continue'
Ketika kita menjalankan skrip ini, kita diminta ketika $ErrorActionPreference
diatur ke Inquire
.
PS C:\temp> .\test.ps1
Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
23 | get-item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The running command stopped because the user selected the Stop option.
Ketika kita memeriksa file log, kita melihat yang berikut:
PS C:\temp> Get-Content .\log.txt
Continue
Get-Item: C:\temp\test.ps1:3
Line |
3 | get-item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot find path 'C:\not-here' because it does not exist.
SilentlyContinue
Stop
Error caught!
Ignore
Inquire
Contoh 7: Mengalihkan data biner dari perintah asli
Dimulai di PowerShell 7.4, PowerShell mempertahankan data byte-stream saat mengalihkan aliran stdout perintah asli ke file atau saat memipakan data byte-stream ke aliran stdin dari perintah asli.
Misalnya, menggunakan perintah curl
asli, Anda dapat mengunduh file biner dan menyimpannya ke disk menggunakan pengalihan.
$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'
# native command redirected to a file
curl -s -L $uri > powershell.tar.gz
Anda juga dapat menyalurkan data byte-stream ke aliran stdin dari perintah asli lainnya. Contoh berikut mengunduh file TAR zip menggunakan curl
.
Data file yang diunduh dialirkan ke tar
perintah untuk mengekstrak konten arsip.
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
Anda juga dapat menyalurkan output byte-stream dari perintah PowerShell ke input perintah asli. Contoh berikut menggunakan Invoke-WebRequest
untuk mengunduh file TAR yang sama dengan contoh sebelumnya.
# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
Fitur ini tidak mendukung data byte-stream saat mengalihkan output stderr ke stdout. Saat Anda menggabungkan aliran stderr dan stdout , aliran gabungan diperlakukan sebagai data string.
Catatan
Operator pengalihan yang tidak menambahkan data (>
dan n>
) menimpa konten file yang ditentukan saat ini tanpa peringatan.
Namun, jika file adalah file baca-saja, tersembunyi, atau sistem, pengalihan gagal. Operator pengalihan tambahan (>>
dan n>>
) tidak menulis ke file baca-saja, tetapi mereka menambahkan konten ke sistem atau file tersembunyi.
Untuk memaksa pengalihan konten ke file baca-saja, tersembunyi, atau sistem, gunakan Out-File
cmdlet dengan parameternya Force
.
Saat Anda menulis ke file, operator pengalihan menggunakan UTF8NoBOM
pengodean. Jika file memiliki pengodean yang berbeda, output mungkin tidak diformat dengan benar. Untuk menulis ke file dengan pengodean yang berbeda, gunakan Out-File
cmdlet dengan parameternya Encoding
.
Lebar output saat menulis ke file
Saat Anda menulis ke file menggunakan salah satu Out-File
atau operator pengalihan, PowerShell memformat output tabel ke file berdasarkan lebar konsol yang dijalankannya. Misalnya, saat mencatat output tabel ke file menggunakan perintah seperti Get-ChildItem Env:\Path > path.log
pada sistem di mana lebar konsol diatur ke 80 kolom, output dalam file dipotong menjadi 80 karakter:
Name Value
---- -----
Path C:\Program Files\PowerShell\7;C:\WINDOWS…
Mengingat bahwa lebar konsol dapat diatur sesegan-segan pada sistem tempat skrip Anda dijalankan, Anda mungkin lebih suka output tabel format PowerShell ke file berdasarkan lebar yang Anda tentukan sebagai gantinya.
Out-File
Cmdlet menyediakan parameter Lebar yang memungkinkan Anda mengatur lebar yang Anda inginkan untuk output tabel. Daripada harus menambahkan -Width 2000
di mana pun Anda memanggil Out-File
, Anda dapat menggunakan $PSDefaultParameterValues
variabel untuk mengatur nilai ini untuk semua penggunaan Out-File
cmdlet dalam skrip. Dan karena operator pengalihan (>
dan >>
) secara efektif alias untuk Out-File
, mengatur Out-File:Width
parameter untuk seluruh skrip berdampak pada lebar pemformatan untuk operator pengalihan juga. Letakkan perintah berikut di dekat bagian atas skrip Anda untuk diatur Out-File:Width
untuk seluruh skrip:
$PSDefaultParameterValues['out-file:width'] = 2000
Meningkatkan lebar output akan meningkatkan konsumsi memori saat tabel pengelogan diformat output. Jika Anda mencatat banyak data tabular untuk file dan Anda tahu Anda bisa mendapatkan dengan lebar yang lebih kecil, gunakan lebar yang lebih kecil.
Dalam beberapa kasus, seperti Get-Service
output, untuk menggunakan lebar tambahan, Anda harus menyalurkan output sebelum Format-Table -AutoSize
menghasilkan ke file.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Untuk informasi selengkapnya tentang $PSDefaultParameterValues
, lihat about_Preference_Variables.
Potensi kebingungan dengan operator perbandingan
Operator >
tidak akan bingung dengan operator Perbandingan yang lebih besar ( sering ditandai seperti >
dalam bahasa pemrograman lainnya).
Tergantung pada objek yang dibandingkan, output yang menggunakan >
dapat tampak benar (karena 36 tidak lebih besar dari 42).
PS> if (36 > 42) { "true" } else { "false" }
false
Namun, pemeriksaan sistem file lokal dapat melihat bahwa file yang disebut 42
ditulis, dengan konten 36
.
PS> dir
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/02/20 10:10 am 3 42
PS> cat 42
36
Mencoba menggunakan perbandingan <
terbalik (kurang dari), menghasilkan kesalahan sistem:
PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
1 | if (36 < 42) { "true" } else { "false" }
| ~
| The '<' operator is reserved for future use.
Jika perbandingan numerik adalah operasi yang diperlukan, -lt
dan -gt
harus digunakan. Untuk informasi selengkapnya, lihat -gt
operator di about_Comparison_Operators.