Пакет - функция - параметры не работают - PullRequest
0 голосов
/ 15 октября 2018

в Windows 7 (64) Я пытаюсь сделать самый простой вызов функции, конечно, странность пакета разрушает его еще раз

Я не понимаю, почему он не принимает параметр, все примеры указывают на этот путь

@ECHO OFF

:import

echo "%~1 %~2"
mysql -u root -e "DROP DATABASE IF EXISTS `%~1`;CREATE DATABASE `%~1`"
IF ERRORLEVEL 1 GOTO error
mysql -u root %~1 < %~1.sql
IF ERRORLEVEL 1 GOTO error


call :import "something"

:error

@echo errors !!

pause

это показывает:

" "
ERROR 1102 (42000) at line 1: Incorrect database name ''
errors !!
Press any key to continue . . .

кажется, что% ~ 1 никогда ничего не содержит

Ответы [ 2 ]

0 голосов
/ 15 октября 2018
@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 или выше.

0 голосов
/ 15 октября 2018

Вы должны структурировать командный файл немного по-другому.

Функции должны быть внизу файла.Метка «import» запускается только внутри «вызова», поэтому не пытайтесь выпрыгнуть из этой метки во время вызова.Позаботьтесь об использовании соответствующих ярлыков для каждого прыжка GOTO.

@ECHO OFF

call :import "something1" "something2"
goto end

:import
echo "%~1 %~2"
mysql -u root -e "DROP DATABASE IF EXISTS `%~1`;CREATE DATABASE `%~1`"
IF ERRORLEVEL 1 GOTO error
mysql -u root %~1 < %~1.sql
IF ERRORLEVEL 1 GOTO error
goto endOfImport
:error
@echo errors !!
:endOfImport
goto :eof

:end
pause
...