批处理 - 功能 - 参数不起作用
Batch - function - parameters not working
on 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 从来没有包含任何东西
您需要稍微改变一下批处理文件的结构。
函数应该在文件的底部。 "import"标签只是运行在一个"call"里面,所以在调用的时候不要试图跳出那个标签。注意为每个 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
@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
,被调用的标签将
return回到call
行。
下面一行if errorlevel 1 call :error
将 call :error
如果 errorlevel
是 set
到 1 或以上。
on 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 从来没有包含任何东西
您需要稍微改变一下批处理文件的结构。
函数应该在文件的底部。 "import"标签只是运行在一个"call"里面,所以在调用的时候不要试图跳出那个标签。注意为每个 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
@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
,被调用的标签将
return回到call
行。
下面一行if errorlevel 1 call :error
将 call :error
如果 errorlevel
是 set
到 1 或以上。