ERRORLEVEL değerini 0 olarak ayarlama


14

Bir yükleyici çevresinde bir sarıcı olan bir toplu iş dosyası var. Bu toplu iş dosyası yükleyici tarafından döndürülen hata düzeyini kontrol eder ve uygun şekilde yazdırır.

set ERRORLEVEL=0Toplu iş dosyasını (aynı komut penceresinde / ortamında) başlatmadan hemen önce bir komut isteminde çalıştırırsam , yükleyicinin asla hata düzeyiyle uğraşmadığını ve toplu komut dosyamın her zaman iletildiğini fark ettim. %ERRORLEVEL%Windows tarafından tanımlanan bir değişken olduğunu ve programlardan ve komut dosyalarından hataları yazdırmak için özel olarak kullanıldığını ve değişkenin bir toplu iş dosyasında veya başka bir şeyin kullanılmasının 'kendi sorumluluğunuzda' olacağını çünkü herhangi bir anda değiştirilebileceğini varsayıyorum başka bir süreç.

Görünüşe göre, verilen ortamda hata seviyesi ayarladığımda, bir şekilde çıkış seviyesinin sahibi olarak hata seviyesinin kullanımını sonlandırır. Bunun neden olduğunu bilen var mı? Bana göre bu sadece garip beklenmedik bir davranış. Konuyla ilgili herhangi bir bilgi çok takdir edilecektir!


Yanıtlar:


14

Sistem değişkenini düzenli olarak yeniden tanımlıyorsunuz. Bunu yaptığınızda, sistem komut oturumu kapatılana kadar kullanmaz.

Kullanmanın en iyi yolu

exit /b 0

başka bir toplu iş dosyasına gidin ve birincil komut dosyanızdan çağırın. 0 sayısı istediğiniz yerde errorlevel. Ya bu ya errorlevelda yankı, findstr gibi sizin için sıfırlayan bir komut kullanın .

Örneğin, aşağıdaki komutların tümü ERRORLEVELtoplu iş dosyanızda 0 olarak ayarlanır :

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
Neredeyse doğru. " set "errorlevel="
ERBORLEVEL" in

Windows neden birisinin sistem değişkenini normal bir değişkenle yeniden tanımlamasına izin veriyor? Her iki tanım hala mevcut mu, sadece yankısı ve diğer komutlar artık normal olanı gösteriyor mu? Yani programlar hala sistem değişkenini güncelliyor olabilir, komut istemi üzerinden erişilemez mi?
user972276

1
"Ya bu, yankı, findstr gibi hata düzeyini sizin için sıfırlayan bir komut kullanın." Echo komutu gelmez değil ErrorLevel değişkeni sıfırlayın.
antred

Diğerlerinin söylediği gibi, errorlevel değişken kullanıcı / toplu iş tarafından "manuel olarak" ayarlandıysa "set errorlevel=0", errorleveldeğişken artık çıkış kodunu yansıtmaz, ancak yine de çıkış koduna erişebilirsiniz if errorlevel do something.
Kevin Fegan

(1) Daha genel bir soru “ERRORLEVEL'i 42 gibi rasgele bir değere nasıl ayarlayabilirim?”  cmd /c exit 42 bunun en iyi cevabı gibi görünüyor. (2) dbenham'ın işaret ettiği gibi  /b, alıntılara veya tırnaklara ihtiyacınız yoktur  .
Scott

12

ERRORLEVEL, PATH, CD, DATE, TIME vb. Dinamik sistem değişkenlerine asla kendi değerinizi atamamalısınız. Bunu yapmak, kodun dinamik değeri görmesini engeller. Kullanıcı tarafından tanımlanan değeri tanımlayarak dinamik değeri geri yükleyebilirsiniz. Örneğin:

set "errorlevel="

0 olarak errorlevel zorlamak istiyorsanız, o zaman bu tamamen sezgisel olmayan, ama çok etkili bir sözdizimi kullanabilirsiniz: (call ). Çağrı sonrası boşluk kritiktir. Hata seviyesini 1 olarak ayarlamak istiyorsanız, kullanabilirsiniz (call). Aramadan sonra yer olmaması çok önemlidir.

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

Hata düzeyini ayarlamak için daha sezgisel, ancak daha az kullanışlı bir yöntem, bir toplu iş dosyasında özel bir alt yordam kullanmaktır:

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

:setErr
exit /b %1

Veya komut satırında,

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%

8

Şahsen bunu kullanıyorum:

cd .

Unix kabuğunda bile çalışır.


Ancak, bu biraz daha hızlı olabilir: type nul>nulÇünkü Process Monitor PS'deki QueryDirectoryçağrıları gösterir cd .: cd .unix kabuğunda başka bir güzel yan etkisi vardır. Silme işleminden önce açılmışsa, terminalde yeniden oluşturulan çalışma dizinini geri yükler.
Andry

2

ErrorLevelMS-DOS'ta bile çalışan durumu sıfırlamanın diğer yolları aşağıdadır (en azından sürüm 6.22 için):

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

Aşağıdaki yöntemler yalnızca MS-DOS'ta çalışır:

command /? > nul

fc nul nul > nul

Tamlık uğruna, bu ErrorLeveldurum 1hem Windows hem de MS-DOS için geçerli olarak ayarlanır :

< nul find ""

1

İşe yarayan bulduğum tek şey bu.

call (exit /b 0)

ERRORLEVEL'i algılayan ancak hata düzeyini kendiliğinden sıfırlamayan 3. taraf komut dosyası kullanan bir komut dosyasında gerekli.


0

Bunlar da çalışır: (Hata seviyesini 1 olarak ayarlar)

Yöntem 1

color 00

Yöntem 2

echo A | find "B"

Hata düzeyi 1-26'yı ayarlamak için de bunu kullanabilirsiniz:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.