@echo off
setlocal
call :import "something"
if errorlevel 1 call :error
exit /b
:import
echo "%~1 %~2"
mysql -u root -e "DROP DATABASE IF EXISTS `%~1`;CREATE DATABASE `%~1`"
if errorlevel 1 exit /b 1
mysql -u root "%~1" < "%~1.sql"
if errorlevel 1 exit /b 2
exit /b
:error
@echo errors !!
pause
exit /b
В размещенном коде вопроса :import
является меткой.Интерпретатор будет игнорировать строку, если только goto
или call
не используется для выполнения с метки.То, что делает код вопроса, идет сверху вниз до тех пор, пока не достигнет строки call
, которая вызывает :import
выше, а затем переходит вниз с вызываемой меткой.Код не доходит до того, что аргументы %~1
и %~2
не определены, так как они интерпретируются как аргументы скрипта вместо именованных аргументов метки, поэтому mysql
ошибки, которые вызывают goto error
.
Код выше вместо этого помещает 2 метки ниже exit /b
, поэтому для доступа к любой из меток необходимо вызвать.Теперь он опустится сверху вниз до строки call :import "something"
, которая выполнит код в метке :import
.Как только он достигнет exit /b
, вызываемая метка вернется к строке call
.Следующая строка if errorlevel 1 call :error
будет call :error
, если errorlevel
равно set
до 1 или выше.