如何检查".bat"文件中的命令行参数?

jav*_*r71 93 windows cmd file batch-file

我的操作系统是Windows Vista.我需要一个".bat"文件,我需要检查用户是否输入任何命令行参数.如果那么,如果参数等于-b那么我会做一些事情,否则我将标记"无效输入".如果用户没有输入任何命令行参数,那么我会做一些事情.我创建了以下.bat文件.它适用于-b和不等于-b案例 - 但是当用户没有传递任何命令行参数时它会失败.

我总是得到错误:

GOTO was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这里我做错了什么?


ECHO OFF
CLS
ECHO.

IF [%1]==[/?] GOTO BLANK

IF %1=="-b" GOTO SPECIFIC

IF NOT %1=="-b" GOTO UNKNOWN

:SPECIFIC

ECHO SPECIFIC

GOTO DONE

:BLANK

ECHO No Parameter

GOTO DONE

:UNKNOWN

ECHO Unknown Option

GOTO DONE

:DONE

ECHO Done!
Run Code Online (Sandbox Code Playgroud)

afr*_*ier 131

您需要检查参数是否为空: if "%~1"=="" goto blank

完成后,然后在-b上执行if/else开关: if "%~1"=="-b" (goto specific) else goto unknown

使用引号包围参数可以更轻松地检查空白/空/缺少参数."〜"确保双引号在命令行参数中被删除.

  • ELSE必须与IF在同一条线上,或者必须直接在支架之后 (6认同)
  • 如果%1包含空格,这似乎对我不起作用,如果它是可执行文件的完整路径,则可能就是这种情况.请参阅[Jeremiah Willcock的答案](http://stackoverflow.com/a/4953226/1840078)以获得一个解决方案,该解决方案甚至适用于其值中包含空格的参数. (4认同)

Jer*_*ock 27

请查看http://ss64.com/nt/if.html以获得答案; 命令是IF [%1]==[] GOTO NO_ARGUMENT或类似的.


Tom*_*dor 18

简答 - 使用方括号:

if [%1]==[] goto :blank
Run Code Online (Sandbox Code Playgroud)

或者(当你需要处理引用的args时,请参阅下面的编辑):

if [%~1]==[] goto :blank
Run Code Online (Sandbox Code Playgroud)

为什么?你可能会问.好吧,就像Jeremiah Willcock提到的那样:http://ss64.com/nt/if.html - 他们使用它!好的,但引号有什么问题?

同样,简短回答:它们是"神奇的" - 有时双(双)引号转换为单(双)引用.他们需要匹配,一开始.

考虑这个小脚本:

@rem argq.bat
@echo off

:loop 
if "%1"=="" goto :done
echo %1
shift
goto :loop

:done
echo Done.
Run Code Online (Sandbox Code Playgroud)

我们来测试一下:

C:\> argq bla bla
bla
bla
Done.
Run Code Online (Sandbox Code Playgroud)

似乎工作.但现在,让我们切换到二档:

C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

Boom这没有评估为真,它也没有评估为假.脚本DIED.如果你应该在某个地方关闭反应堆,那么运气不错.你现在会像Harry Daghlian一样死去.

您可能会认为 - 好吧,参数不能包含引号.如果他们这样做,就会发生 错了这里有些安慰:

C:\> argq ""bla bla""
""bla
bla""
Done.
Run Code Online (Sandbox Code Playgroud)

哦耶.别担心 - 有时起作用.

我们试试另一个脚本:

@rem args.bat
@echo off

:loop 
if [%1]==[] goto :done
echo %1
shift
goto :loop

:done
echo Done.
Run Code Online (Sandbox Code Playgroud)

您可以测试自己,它适用于上述情况.这是合乎逻辑的 - 引号与括号无关,所以这里没有魔力.但是如何用括号括起来呢?

D:\>args ]bla bla[
]bla
bla[
Done.

D:\>args [bla bla]
[bla
bla]
Done.
Run Code Online (Sandbox Code Playgroud)

那里没有运气.括号只是不能阻塞cmd.exe的解析器.

让我们回到邪恶的名言一会儿.当争论以引用结束时,问题出在那里:

D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

如果我通过了怎么办:

D:\>argq bla2"
The syntax of the command is incorrect.
Run Code Online (Sandbox Code Playgroud)

该脚本根本不会运行.同样的args.bat:

D:\>args bla2"
The syntax of the command is incorrect.
Run Code Online (Sandbox Code Playgroud)

但是",在这种情况下,当字符数"匹配"(即 - 是偶数)时,我得到了什么:

D:\>args bla2" "bla3
bla2" "bla3
Done.
Run Code Online (Sandbox Code Playgroud)

NICE - 我希望你学到了一些关于.bat文件如何拆分命令行参数的东西(提示:*它与bash不完全相同).上面的参数包含一个空格.但引号不会自动剥离.

和argq?它对此有何反应?可以预见的是:

D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

所以 - 在你说:"知道什么之前想想.只需使用引号.[因为,对我来说,这看起来更好]".

编辑

最近,有关于这个答案的评论 - 好吧,sqare括号"无法处理"传递引用的参数并将它们视为没有引用它们.

语法:

if "%~1"=="" (...)
Run Code Online (Sandbox Code Playgroud)

不是一些新发现的双引号的优点,而是显示从参数变量中剥离引号的简洁功能,如果第一个和最后一个字符是双引号.

这种"技术"与方括号一样有效:

if [%~1]==[] (...)
Run Code Online (Sandbox Code Playgroud)

指出这一点是有用的,所以我也提出了新的答案.

最后,双引号粉丝,""你的书中是否存在表格的论点,还是空白?请问';)


PA.*_*PA. 8

除了我订阅的其他答案之外,您可以考虑使用命令的/I开关IF.

.../I切换,如果指定,表示要进行不区分大小写的字符串比较.

如果您希望为用户提供不区分大小写的灵活性来指定参数,那么它可能会有所帮助.

IF /I "%1"=="-b" GOTO SPECIFIC
Run Code Online (Sandbox Code Playgroud)


Jef*_*ado 5

你正在比较字符串.如果省略了参数,则%1展开为空白,以便命令变为IF =="-b" GOTO SPECIFIC示例(这是语法错误).用引号(或方括号)包裹你的字符串.

REM this is ok
IF [%1]==[/?] GOTO BLANK

REM I'd recommend using quotes exclusively
IF "%1"=="-b" GOTO SPECIFIC

IF NOT "%1"=="-b" GOTO UNKNOWN
Run Code Online (Sandbox Code Playgroud)


wis*_*cky 5

实际上,所有其他答案都有缺陷.最可靠的方法是:

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)
Run Code Online (Sandbox Code Playgroud)

详细说明:

"%1"=="-b"如果使用空格和引号传递参数,则使用将会导致崩溃.这是最不可靠的方法.

IF "%1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat "a b"

b""=="-b" was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

使用[%1]==[-b]更好是因为它不会与空格和引号一起崩溃,但如果参数被引号括起来则不会匹配.

IF [%1]==[-b] (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat "-b"

(does not match, and jumps to UNKNOWN instead of SPECIFIC)
Run Code Online (Sandbox Code Playgroud)

使用"%~1"=="-b"是最可靠的.%~1如果它们存在,将删除周围的引号.因此它可以使用和不使用引号,也可以不使用args.

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat
C:\> run.bat -b
C:\> run.bat "-b"
C:\> run.bat "a b"

(all of the above tests work correctly)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

180873 次

最近记录:

8 年 前