Ketika skrip PowerShell saya mencoba, misalnya, untuk membuat objek SQL Server untuk server yang tidak ada ("bla" dalam kasus saya), PowerShell menampilkan banyak kesalahan PowerShell dengan warna merah.
Karena skrip saya memeriksa nilai $?
setelah panggilan seperti itu, dan menampilkan serta mencatat kesalahan, saya lebih suka tidak menampilkan beberapa baris kesalahan PowerShell juga.
Bagaimana saya bisa menonaktifkan yang ditampilkan untuk skrip saya?
sumber
-ErrorAction:SilentlyContinue
pada PS 5.1. Saya memanggil cmdlet saya dari batch jadi saya tidak tahu apakah itu membuat perbedaan. Tapi info bagus bila Anda tahu kesalahan yang dapat diterima mungkin terlempar.Windows PowerShell menyediakan dua mekanisme untuk melaporkan kesalahan: satu mekanisme untuk menghentikan kesalahan dan mekanisme lain untuk kesalahan non-terminating .
Kode CmdLets internal dapat memanggil
ThrowTerminatingError
metode ketika terjadi kesalahan yang tidak atau seharusnya tidak memungkinkan cmdlet untuk terus memproses objek masukannya. Penulis skrip dapat menggunakan pengecualian untuk menangkap kesalahan ini.EX:
Kode CmdLets internal dapat memanggil
WriteError
metode untuk melaporkan kesalahan non-penghentian ketika cmdlet dapat melanjutkan pemrosesan objek masukan. Penulis skrip kemudian dapat menggunakan opsi -ErrorAction untuk menyembunyikan pesan, atau menggunakan$ErrorActionPreference
untuk menyiapkan seluruh perilaku skrip.sumber
Saya mengalami masalah serupa saat mencoba menyelesaikan nama host menggunakan
[system.net.dns]
. Jika IP tidak terselesaikan, Net melemparkan kesalahan penghentian. Untuk mencegah kesalahan penghentian dan masih mempertahankan kontrol output, saya membuat fungsi menggunakanTRAP
.MISALNYA
Function Get-IP {PARAM ([string]$HostName="") PROCESS {TRAP {"" ;continue} [system.net.dns]::gethostaddresses($HostName) } }
sumber
Anda keluar jalur di sini.
Anda sudah mendapatkan pesan kesalahan besar yang bagus. Mengapa Anda ingin menulis kode yang memeriksa
$?
secara eksplisit setelah setiap perintah ? Ini sangat rumit dan rawan kesalahan. Solusi yang tepat adalah berhenti mengecek$?
.Sebagai gantinya, gunakan mekanisme bawaan PowerShell untuk meledakkannya untuk Anda. Anda mengaktifkannya dengan mengatur preferensi kesalahan ke level tertinggi:
$ErrorActionPreference = 'Stop'
Saya meletakkan ini di bagian atas setiap skrip yang pernah saya tulis, dan sekarang saya tidak perlu memeriksanya
$?
. Ini membuat kode saya jauh lebih sederhana dan lebih dapat diandalkan.Jika Anda mengalami situasi di mana Anda benar - benar perlu menonaktifkan perilaku ini, Anda dapat melakukan
catch
kesalahan atau meneruskan pengaturan ke fungsi tertentu menggunakan common-ErrorAction
. Dalam kasus Anda, Anda mungkin ingin proses Anda berhenti pada kesalahan pertama, menangkap kesalahan, dan kemudian mencatatnya.Perhatikan bahwa ini tidak menangani kasus ketika executable eksternal gagal (kode keluar bukan nol, secara konvensional), jadi Anda masih perlu memeriksa
$LASTEXITCODE
apakah Anda memanggil. Terlepas dari batasan ini, pengaturannya masih menyimpan banyak kode dan upaya.Keandalan tambahan
Anda mungkin juga ingin mempertimbangkan untuk menggunakan mode ketat :
Ini mencegah PowerShell melanjutkan secara diam-diam saat Anda menggunakan variabel yang tidak ada dan dalam situasi aneh lainnya. (Lihat
-Version
parameter untuk detail tentang apa yang dibatasi.)Menggabungkan dua pengaturan ini membuat PowerShell lebih dari bahasa gagal-cepat, yang membuat pemrograman di dalamnya jauh lebih mudah.
sumber
Tambahkan
-ErrorAction SilentlyContinue
ke skrip Anda dan Anda akan baik-baik saja.sumber
Dalam beberapa kasus, Anda dapat menyalurkan setelah perintah a Out-Null
command | Out-Null
sumber
Jika Anda ingin errormessage powershell untuk cmdlet disembunyikan, tetapi masih ingin mengetahui kesalahannya, gunakan "-erroraction 'silentlyStop'"
sumber
New-Item -ItemType directory
(PowerShell v2.0)