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

时间:2018-10-15 11:08:29

标签: batch-file windows-7-x64

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

上面的代码将2个标签放在 exit /b,因此任何一个标签都需要调用 访问。 现在它将从顶部下降到 call :import "something"行, 它将执行:import标签中的代码。 到达exit /b后,被叫标签将 返回到call的行。 if errorlevel 1 call :error的以下行 如果call :errorerrorlevel到1或更高,将set