mengatur ERRORLEVEL ke 0

14

Saya memiliki file batch yang merupakan pembungkus di sekitar installer. File batch ini memeriksa tingkat kesalahan yang dikembalikan oleh penginstal dan mencetak sesuai.

Saya perhatikan bahwa jika saya mengeksekusi set ERRORLEVEL=0di prompt perintah tepat sebelum memulai file batch (di jendela perintah / lingkungan yang sama), installer tidak pernah mengacaukan tingkat kesalahan dan script batch saya selalu kembali berlalu. Saya akan berasumsi %ERRORLEVEL%adalah variabel yang didefinisikan oleh Windows dan digunakan secara khusus untuk mencetak kesalahan dari program dan skrip dan bahwa menggunakan variabel dalam file batch atau sesuatu yang lain akan 'dengan risiko Anda sendiri' karena itu dapat diubah setiap saat dengan proses lain.

Dari apa yang tampak seperti, ketika saya mengatur errorlevel di lingkungan yang diberikan, itu kemudian entah bagaimana mengakhiri penggunaan errorlevel sebagai pemegang kode keluar. Adakah yang tahu mengapa ini terjadi? Bagi saya itu perilaku aneh yang tak terduga. Setiap informasi tentang masalah ini akan sangat dihargai!

pengguna972276
sumber

Jawaban:

14

Anda mendefinisikan ulang variabel sistem menjadi variabel biasa. Ketika Anda melakukan ini, sistem tidak akan menggunakannya sampai sesi perintah ditutup.

Cara terbaik adalah menggunakan

exit /b 0

dalam file batch lain dan panggil dari skrip utama Anda. Di mana angka 0 adalah yang Anda inginkan errorlevel. Entah itu atau gunakan perintah yang mengatur ulang errorleveluntuk Anda, seperti gema, findstr dll.

Sebagai contoh, perintah-perintah berikut akan diatur ERRORLEVELke 0 dalam file-batch Anda:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
TwirlMandarin
sumber
2
Hampir benar. Anda bisa mendapatkan "sistem" untuk menggunakan ERRORLEVEL dinamis hanya dengan membatalkan nilai apa pun yang ditentukan pengguna menggunakanset "errorlevel="
dbenham
Mengapa Windows mengizinkan seseorang untuk mendefinisikan ulang variabel sistem menjadi variabel biasa? Apakah kedua definisi tersebut masih ada, hanya gema dan perintah lain seperti sekarang menunjuk ke yang biasa? Jadi program masih bisa memperbarui variabel sistem, hanya saja tidak dapat diakses melalui command prompt?
user972276
1
"Entah itu atau gunakan perintah yang mengatur ulang tingkat kesalahan untuk Anda, seperti gema, findstr dll." Perintah echo tidak mereset variabel tingkat kesalahan.
antred
Seperti yang dikatakan orang lain, jika errorlevel variabel telah "secara manual" ditetapkan oleh pengguna / kelompok dengan "set errorlevel=0", errorlevelvariabel tidak akan lagi mencerminkan kode keluar, tetapi Anda masih dapat mengakses kode keluar dengan if errorlevel do something.
Kevin Fegan
(1) Pertanyaan yang lebih umum adalah "Bagaimana cara menetapkan ERRORLEVEL ke beberapa nilai arbitrer, seperti 42?"  cmd /c exit 42 tampaknya menjadi jawaban terbaik untuk itu. (2) Seperti yang  ditunjukkan dbenham , Anda tidak memerlukan  /batau kutipannya.
Scott
12

Anda tidak boleh menetapkan nilai Anda sendiri ke variabel sistem dinamis seperti ERRORLEVEL, PATH, CD, DATE, TIME, dll. Melakukan hal itu akan mencegah kode melihat nilai dinamis. Anda dapat mengembalikan nilai dinamis dengan hanya membatalkan nilai yang ditentukan pengguna. Sebagai contoh:

set "errorlevel="

Jika Anda ingin memaksa errorlevel ke 0, maka Anda dapat menggunakan sintaks benar-benar non-intuitif, tapi sangat efektif: (call ). Ruang setelah panggilan sangat penting. Jika Anda ingin mengatur tingkat kesalahan ke 1, Anda dapat menggunakan (call). Sangat penting bahwa tidak ada ruang setelah panggilan.

(call)
echo %errorlevel%
(call )
echo %errorlevel%

Metode yang lebih intuitif, tetapi kurang nyaman untuk mengatur tingkat kesalahan adalah dengan menggunakan subrutin khusus dalam file batch:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

Atau jika di baris perintah, Anda bisa menggunakan

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
dbenham
sumber
8

Saya pribadi menggunakan ini:

cd .

Bekerja bahkan di shell unix.

Andry
sumber
Tapi, yang ini mungkin sedikit lebih cepat: type nul>nulKarena Proses Monitor menunjukkan QueryDirectorypanggilan pada cd .PS: cd .memiliki efek samping lain yang bagus di shell unix. Itu mengembalikan direktori kerja yang dibuat kembali di terminal jika telah dibuka sebelum menghapus.
Andry
2

Berikut adalah beberapa cara lain untuk mengatur ulang ErrorLevelkeadaan, yang bahkan berfungsi di MS-DOS (setidaknya untuk versi 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Metode berikut ini hanya berfungsi dalam MS-DOS:

command /? > nul

fc nul nul > nul

Demi kelengkapan, ini mengatur ErrorLevelkeadaan 1, berlaku untuk Windows dan MS-DOS:

< nul find ""
aschipfl
sumber
1

Ini adalah satu-satunya hal yang menurut saya berhasil.

call (exit /b 0)

Membutuhkannya dalam skrip yang menggunakan skrip pihak ke-3 yang mendeteksi ERRORLEVEL, tetapi tidak menyetel ulang tingkat kesalahan sendiri dengan benar.

Richard Meadows
sumber
0

Ini juga akan berfungsi: (Setel tingkat kesalahan ke 1)

Metode 1

color 00

Metode 2

echo A | find "B"

Anda juga dapat menggunakan ini untuk mengatur tingkat kesalahan 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Wasif Hasan
sumber