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 menggunakan Out-File cmdlet ketika Anda perlu menggunakan parameternya, seperti Encodingparameter , , ForceWidth, atau NoClobber .

  • 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 dengan Out-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 disebut C:\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.

Baca juga