Saya ingin skrip PowerShell saya berhenti ketika salah satu perintah yang saya jalankan gagal (seperti set -e
dalam bash). Saya menggunakan perintah Powershell ( New-Object System.Net.WebClient
) dan program ( .\setup.exe
).
sumber
Saya ingin skrip PowerShell saya berhenti ketika salah satu perintah yang saya jalankan gagal (seperti set -e
dalam bash). Saya menggunakan perintah Powershell ( New-Object System.Net.WebClient
) dan program ( .\setup.exe
).
$ErrorActionPreference = "Stop"
akan membuat Anda menjadi bagian dari perjalanan ke sana (yaitu ini berfungsi bagus untuk cmdlets).
Namun untuk EXE Anda harus memeriksa $LastExitCode
diri Anda sendiri setelah setiap pemanggilan exe dan menentukan apakah itu gagal atau tidak. Sayangnya saya tidak berpikir PowerShell dapat membantu di sini karena pada Windows, EXEs tidak terlalu konsisten pada apa yang merupakan kode keluar "sukses" atau "kegagalan". Sebagian besar mengikuti standar UNIX 0 yang menunjukkan keberhasilan tetapi tidak semua melakukannya. Lihat fungsi CheckLastExitCode di posting blog ini . Anda mungkin menemukan itu berguna.
$ErrorActionPreference = "Stop"
bekerja untuk program yang berperilaku baik (yang mengembalikan 0 pada keberhasilan)?throw "$exe failed with exit code $LastExitCode"
mana $ exe hanyalah jalan menuju EXE.Anda harus dapat mencapai ini dengan menggunakan pernyataan
$ErrorActionPreference = "Stop"
di awal skrip Anda.Pengaturan defaultnya
$ErrorActionPreference
adalahContinue
, itulah sebabnya Anda melihat skrip Anda terus terjadi setelah kesalahan terjadi.sumber
Sayangnya, karena cmdlets bermasalah seperti New-RegKey dan Clear-Disk , tidak ada jawaban yang cukup. Saat ini saya telah menetapkan baris berikut di bagian atas skrip PowerShell untuk menjaga kewarasan saya.
dan lalu panggilan asli apa pun yang mendapatkan perawatan ini:
Pola panggilan asli itu perlahan-lahan menjadi cukup umum bagi saya sehingga saya mungkin harus mencari opsi untuk membuatnya lebih ringkas. Saya masih seorang pemula yang tangguh, jadi saran dipersilahkan.
sumber
Anda perlu penanganan kesalahan yang sedikit berbeda untuk fungsi PowerShell dan untuk memanggil exe, dan Anda harus memastikan untuk memberi tahu penelepon skrip Anda bahwa ia telah gagal. Membangun di atas dari
Exec
perpustakaan Psake, skrip yang memiliki struktur di bawah ini akan berhenti pada semua kesalahan, dan dapat digunakan sebagai templat dasar untuk sebagian besar skrip.sumber
Exec { sqlite3.exe -bail some.db "$SQL" }
, yang-bail
menyebabkan kesalahan karena mencoba untuk menafsirkannya sebagai parameter Cmdlet? Membungkus barang dengan tanda kutip sepertinya tidak berhasil. Ada ide?Sedikit modifikasi pada jawaban dari @alastairtree:
Perbedaan utama di sini adalah:
Invoke-Command
)-ErrorAction
perilaku dari built in cmdletssumber
Invoke-Call { dotnet build $something }
& @ScriptBlock
dan& $ScriptBlock
tampaknya melakukan hal yang sama. Belum dapat Google perbedaan apa dalam kasus iniSaya baru mengenal PowerShell tetapi ini tampaknya paling efektif:
sumber
Saya datang ke sini mencari hal yang sama. $ ErrorActionPreference = "Stop" membunuh shell saya segera ketika saya lebih suka melihat pesan kesalahan (jeda) sebelum itu berakhir. Mengalami kepekaan batch saya:
Saya menemukan bahwa ini berfungsi hampir sama untuk skrip ps1 khusus saya:
sumber
Mengarahkan kembali
stderr
kestdout
tampaknya juga melakukan trik tanpa pembungkus perintah / script lainnya meskipun saya tidak dapat menemukan penjelasan mengapa itu bekerja seperti itu ..Ini akan menampilkan yang berikut seperti yang diharapkan (perintah
aws s3 ...
kembali$LASTEXITCODE = 255
)sumber