Saya memiliki file batch yang memanggil executable yang sama berulang kali dengan parameter yang berbeda. Bagaimana cara saya membuatnya segera berakhir jika salah satu panggilan mengembalikan kode kesalahan dari tingkat apa pun?
Pada dasarnya, saya ingin yang setara dengan MSBuild ContinueOnError=false
.
batch-file
Josh Kodroff
sumber
sumber
Jawaban:
Periksa
errorlevel
dalam sebuahif
pernyataan, dan kemudianexit /b
(keluar b berkas atch saja, bukan seluruh proses cmd.exe) untuk nilai-nilai selain 0.Jika Anda ingin nilai tingkat kesalahan menyebar di luar file batch Anda
tetapi jika ini di dalam
for
itu agak rumit. Anda akan membutuhkan sesuatu yang lebih seperti:Sunting: Anda harus memeriksa kesalahan setelah setiap perintah. Tidak ada tipe konstruksi "on error goto" global dalam batch cmd.exe / command.com. Saya juga telah memperbarui kode saya per CodeMonkey , meskipun saya belum pernah menemukan tingkat kesalahan negatif dalam salah satu batch-hacking saya di XP atau Vista.
sumber
neq
) diaktifkan / dinonaktifkan tidak masalah menggunakanif not errorlevel 1 exit /B
seperti yang dijelaskan oleh Microsoft dalam artikel dukungan Menggunakan operator pengalihan perintah dan dalam output bantuan saat menjalankanif /?
dalam jendela cmd. Tingkat kesalahan saat ini (kode keluar) terus keluar dari pemrosesan file batch denganexit /B
. Catatan:exit
dengan parameter/B
memerlukan ekstensi perintah yang diaktifkan, lihat Di mana GOTO: EOF kembali ke?Tambahkan
|| goto :label
ke setiap baris, lalu tentukan a:label
.Misalnya, buat file .cmd ini:
Lihat juga pertanyaan tentang keluar dari subrutin file batch .
sumber
command || (SET ErrorLine=102 && goto :error)
||
tujuan utama. Mungkin tidak kebagian goto, tetapi "coba, lakukan ini pada kesalahan" seperti Fowl disebutkan. Pertanyaan saya adalah apakah ini berfungsi untuk semua kode keluar yang bukan nol? Hanya positif?cmd /k exit -1 && echo success || echo fail
- cetakan gagal.command || exit /b %errorlevel%
Yang paling pendek:
Jika perlu, Anda dapat mengatur kode keluar:
Dan Anda juga dapat login:
sumber
%ERRORLEVEL%
tidak tersentuh saat Anda meneleponexit /b
, jadi kode kesalahan diteruskanSatu pembaruan kecil, Anda harus mengubah pemeriksaan "jika tingkat kesalahan 1" menjadi yang berikut ...
Ini karena pada XP Anda bisa mendapatkan angka negatif sebagai kesalahan. 0 = tidak ada masalah, yang lainnya adalah masalah.
Dan perlu diingat cara DOS menangani tes "JIKA ERRORLEVEL". Ini akan mengembalikan true jika nomor yang Anda periksa adalah angka itu atau lebih tinggi jadi jika Anda mencari nomor kesalahan tertentu Anda harus mulai dengan 255 dan menghitung.
sumber
Berikut adalah program polyglot untuk BASH dan Windows CMD yang menjalankan serangkaian perintah dan berhenti jika ada yang gagal:
Saya telah menggunakan hal semacam ini di masa lalu untuk skrip integrasi berkelanjutan beberapa platform .
sumber
Saya lebih suka bentuk perintah ATAU, karena saya menemukan mereka yang paling mudah dibaca (sebagai lawan memiliki jika setelah setiap perintah). Namun, cara naif untuk melakukan hal ini,
command || exit /b %ERRORLEVEL%
adalah salah .Ini karena batch memperluas variabel ketika sebuah baris pertama kali dibaca, bukan ketika mereka sedang digunakan. Ini berarti bahwa jika
command
dalam baris di atas gagal, file batch keluar dengan benar, tetapi keluar dengan kode pengembalian 0, karena itulah nilai%ERRORLEVEL%
pada awal baris. Jelas, ini tidak diinginkan dalam skrip kami, jadi kami harus mengaktifkan ekspansi yang tertunda , seperti:Cuplikan ini akan menjalankan perintah 1-4, dan jika salah satu dari mereka gagal, ia akan keluar dengan kode keluar yang sama seperti yang dilakukan oleh perintah yang gagal.
sumber
Kami tidak selalu dapat bergantung pada ERRORLEVEL, karena berkali-kali program eksternal atau skrip batch tidak mengembalikan kode keluar.
Dalam hal ini kita dapat menggunakan pemeriksaan umum untuk kegagalan seperti ini:
Dan jika program mengeluarkan sesuatu ke konsol, kita dapat memeriksanya juga.
sumber
Tidak peduli bagaimana saya mencoba, tingkat kesalahan selalu tetap 0 bahkan ketika msbuild gagal. Jadi saya membangun solusi saya:
Bangun Proyek dan simpan log ke Build.log
cari string "0 Error" di build log, atur hasilnya ke var
dapatkan karakter terakhir, yang menunjukkan berapa banyak baris berisi string pencarian
jika string tidak ditemukan, maka error> 0, build gagal
Solusi itu terinspirasi oleh posting Mechaflash di Cara mengatur output perintah sebagai variabel dalam file batch
dan https://ss64.com/nt/syntax-substring.html
sumber
for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F
. Catatan:find "0 Error"
juga akan ditemukan10 Errors
.sumber