解析批处理文件中的命令行参数

解析批处理文件中的命令行参数

我选择以下示例来了解 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

相关内容