批处理 - 功能 - 参数不起作用

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是一个标签。 解释器将忽略该行,除非 gotocall用于从标签开始执行。 问题代码所做的是从顶部开始 到底部,直到到达 call 行 在上面调用 :import 然后继续执行 称为标签。代码没有那么远 %~1%~2 的参数未定义,因为 它们被解释为脚本参数 而不是调用标签参数,所以 mysql 导致 goto error 发生的错误。

上面的代码将 2 个标签放在 exit /b 所以需要调用其中一个标签 访问。 它现在将从顶部下降到 call :import "something" 行, 它将执行 :import 标签中的代码。 一旦达到 exit /b,被调用的标签将 return回到call行。 下面一行if errorlevel 1 call :errorcall :error 如果 errorlevelset 到 1 或以上。