在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似乎不包含任何东西
答案 0 :(得分:1)
您需要稍微修改批处理文件的结构。
功能应位于文件的底部。 “导入”标签仅在“调用”内部运行,因此请勿在调用过程中跳出该标签。注意每次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
答案 1 :(得分:1)
@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
到1或更高,将set
。