Bagaimana saya bisa keluar dari file batch dari dalam subrutin?
Jika saya menggunakan perintah EXIT, saya cukup kembali ke baris tempat saya memanggil subrutin, dan eksekusi berlanjut.
Ini sebuah contoh:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Keluaran:
Quitting...
Still here!
Memperbarui:
Ini bukan jawaban yang tepat, tetapi saya akhirnya melakukan sesuatu seperti:
@echo off
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
ECHO You shouldn't see this!
GOTO END
:SUBROUTINE_WITH_ERROR
ECHO Simulating failure...
EXIT /B 1
:HANDLE_FAIL
ECHO FAILURE!
EXIT /B 1
:END
ECHO NORMAL EXIT!
EXIT /B 0
Pernyataan pipa ganda:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
adalah singkatan untuk:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
Saya masih ingin tahu apakah ada cara untuk keluar langsung dari subrutin daripada harus membuat Penelepon menangani situasi, tetapi ini setidaknya menyelesaikan pekerjaan.
Pembaruan # 2: Ketika memanggil subrutin dari dalam subrutin lain, dipanggil dengan cara di atas, saya menelepon dari dalam subrutin berikut:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
Dengan cara ini, kesalahan menyebar kembali ke "utama", sehingga untuk berbicara. Bagian utama dari batch kemudian dapat menangani kesalahan dengan penangan kesalahan GOTO: FAILURE
GOTO :EOF
%~0
ke variabel bukantrue
:if not "%selfwrapped%"=="%~0" ( set selfwrapped=%~0 .... )
. Dengan cara itu Anda dapat menggunakan trik yang sama dalam beberapa skrip batch yang saling memanggil.%~0
) dengan semua argumen (%*
) dari cmd.exe bersarang, dan/s
digunakan untuk mengontrol cara%ComSpec%
argumen menangani tanda kutip ganda di sekitar panggilan.Bagaimana dengan penyesuaian kecil ini?
Keluaran:
Secara teknis ini tidak keluar dari dalam subrutin. Sebaliknya, ia hanya memeriksa hasil subrutin dan mengambil tindakan dari sana.
sumber
Jika Anda tidak ingin kembali dari prosedur, jangan gunakan
call
: alih-alih gunakangoto
.sumber
Saya menempatkan penanganan kesalahan dalam file batch saya. Anda dapat memanggil penangan kesalahan seperti ini:
Dan inilah akhir dari file batch:
sumber
Ini akan keluar dari konteks saat ini dan konteks induk (yaitu, ketika dieksekusi di dalam satu
call
skrip subrutin mendalam akan keluar):Atau, jika Anda membutuhkan tingkat kesalahan 0:
Pada dasarnya,
(goto) 2>nul
setel tingkat kesalahan ke 1 (tanpa menghasilkan kesalahan), mengembalikan eksekusi ke konteks induk dan kode setelah pipa ganda dieksekusi dalam konteks induk.type nul>nul
setel tingkat kesalahan ke 0.UPD:
Untuk mengembalikan eksekusi lebih dari dua kali berturut-turut, rantai beberapa
(goto) 2>nul ||
seperti ini:Berikut ini adalah subrutin rekursif untuk mengembalikan konteks beberapa kali:
Ketika dipanggil dari fungsi rekursif:
hasilnya adalah:
sumber