2009-06-01 19 views
6

bir şey böyle o birkaç alt rutinleri ile bir windows toplu iş dosyası var:Windows toplu iş dosyasındaki 'call'ed rutin' içinden nasıl sonlanır?

call :a 
goto :eof 

:a 
call :b 
goto :eof 

:b 
:: How do I directly exit here from here? 
goto :eof 

Vista üzerinde bir cmd penceresinde bu koşuyorum.
Toplu iş dosyasında bir yerde bir hata tespit edersem, sıfır olmayan bir hata seviyesinden çıkmasını istiyorum. Rutininde yazabileceğim bir şey var mı: b toplu iş dosyasının bu şekilde sonlandırılmasına neden olacak.

  • Tüm cmd penceresini kapatan 'exit'i denedim. İstediğim bu değil.
  • 'Çık/B 1' denedim. Bu önceki rutine döner. Her 'çağrı' sonrasında bu şemayı kullanmak için, her bir 'çağrı' dan sonra, hata iletisini geri çağırmak için dikkatle 'hata seviyesi 1 çıkış/B 1' yazmak zorunda kaldım. Her çağrıdan sonra bu satırı yazmamayı tercih ederim.

Bu makale ilginçti, ancak alternatiflerin hiçbiri istediğim gibi davranmıyordu. http://www.computerhope.com/exithlp.htm

Başka bir yolu var mı?

Teşekkürler.

cevap

14

Çok sevdiği altyordamlarını çağırabilir: Bu biraz daha kısa olduğunu ve size bir satır kaydeder eşdeğerdir

call :b||exit /b 1 

call :b 
if errorlevel 1 exit /b 1 

için, ama yine de ideal değil, kabul ediyorum. Bunun dışında bir yol görmüyorum.

DÜZENLEME: Tamam, bir yol var, ama Pure Evil ™. En büyük yığın boyutu ve bu yüzden yineleme sınırı yanlış kullanılması

, basitçe yinelemeli Kendisine göre yığın egzoz bir alt yordam oluşturmak:

@echo off 
echo Calling a 
call :a 
echo Called a 
goto :eof 
:a 
echo Calling b 
call :b 
echo Called b 
goto :eof 
:b 
echo Trying to exit 
call :exit 
goto :eof 
:exit 
call :exit 

Ancak bu, pis hata mesajı neden olur

 
****** B A T C H R E C U R S I O N exceeds STACK limits ****** 
Recursion Count=704, Stack Usage=90 percent 
******  B A T C H PROCESSING IS A B O R T E D  ****** 

Ayrıca, makinemde yaklaşık 2 saniye sürecek.

Sen şöyle call ifadeyi değiştirerek hata iletisini kaldırmak kullanabilirsiniz:

call :exit >nul 2>&1 

büyük boşluğa o çıkışa istediği her şeyi yönlendirir hangi.

Ancak yığını doldurmak için gereken süreyi düşünürsek, ilk varyantın daha kolay olacağını düşünüyorum.

Ayrıca, ikinci bir toplu iş dosyası kullanarak düşünmekteydim; bu, call olmadan çalıştırıldığında esas olarak ilkini durduracaktır. Ama bir şekilde bu altprogramlarla iyi oynamıyor. Çağrı yığınının açılması hala devam ediyor.

+4

Harika, teşekkürler. Şimdiye kadarki en iyisi bu. Buradan "call: a || goto: eof" komutunu kullanmamı buldum, sonra errorlevel geri yayılacak. Belirli hata seviyesinde kullanılabilir bir anlam varsa yararlıdır. –

+0

Evet, bu gerçekten daha iyi geliyor. Düşünmedim. Ayrıca, özetlenen yinelemeli abort gerçek bir seçenek değil, sanırım :) – Joey

+0

Evet, özyineli iptal yeni, ama biraz fazla uzakta! :) –

0

Üst yarasa dosyasını başlık adına göre öldüren bir exit.bat dosyası oluşturabilirsiniz.

Örnek:

@echo off 
title A.bat 
echo A.bat 
call B.bat 
echo A.bat 

B.bat

@echo off 
echo B.bat 
exit.bat A.bat 
echo B.bat 

Exit.bat

A.bat
+1

kesinlikle serin ve kesinlikle kötüyken, bu yaklaşım tam cmd sürecinden kurtulacaktır. Tam olarak hangi çıkışın yapılacağı ve OP'nin kabul edilebilir olduğunu düşünmediği. Ayrıca, Windows'da kill komutu olmadığından kill kill görevkill/fi "windowtitle -qq% 1" ile değiştirilmesi gerekir. – Joey

+0

Ah "Windows için hata ayıklama araçları" (WinDbg) yüklü ve kill.exe bir kopyasını içerir. Orada olduğumu fark etmediğim taskkill komutu için teşekkürler. –

+0

Tüm pencereyi daha az ağrılı bir şekilde öldürmek için acı çekmek için, öldürmek istediğiniz parçayı ateşlemek için her zaman başlangıç ​​cmd a.bat'ı kullanabilirsiniz. –

İlgili konular