我选择以下示例来了解 BATCH 文件中命令行参数的解析:
@echo off
:Help
echo sumit
:GETOPTS
if /I "%1" == "-h" call :Help
if /I "%1" == "-b" set BASE=%2 & shift
if /I "%1" == "-s" set SQL=%2 & shift
shift
if not "%1" == "" goto GETOPTS
echo %BASE%
echo %SQL%
现在,有几个问题,即使我在执行期间没有向批处理文件传递 -h 选项,也会调用 :Help。
如何避免?
optgets.bat -b milan -s okaz
sumit
milan
okaz
由于我没有传递 -h 选项,因此它不应该打印 sumit
其次,一旦执行完成,它应该取消使用命令行参数设置的变量
答案1
为了调试原始源代码文件,您可以简单地echo
使用命令跳过初始命令goto
:
@echo off
goto GETOPTS
:Help
echo sumit
:GETOPTS
if /I "%1" == "-h" call :Help
if /I "%1" == "-b" set BASE=%2 & shift
if /I "%1" == "-s" set SQL=%2 & shift
shift
if not "%1" == "" goto GETOPTS
echo %BASE%
echo %SQL%
您能否解释一下下面这段话的意思?
其次,一旦执行完成,它应该取消使用命令行参数设置的变量。
答案2
此批处理文件将总是执行此操作,echo sumit
因为它是文件中的第一件事。
你的意思肯定是这样的:
@echo off
:GETOPTS
if /I "%1" == "-h" goto Help
if /I "%1" == "-b" set BASE=%2 & shift
if /I "%1" == "-s" set SQL=%2 & shift
shift
if not "%1" == "" goto GETOPTS
echo %BASE%
echo %SQL%
exit
:Help
echo sumit
exit
答案3
仅仅因为某个东西位于标签下并不意味着标签被视为要调用的函数。您需要goto GETOPTS
在行前使用:help
。(cmd.exe 也没有“调用”的概念,因此您需要在goto
当前有的位置使用call
。)
对于您的第二个问题,可以使用命令对 cmd 文件(甚至是 cmd 文件的区域)进行本地环境更改SETLOCAL
。