109

我正在尝试在批处理文件中使用以下验证逻辑,但即使没有向批处理文件提供参数,“使用”块也不会执行。

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

我究竟做错了什么?

4

7 回答 7

168

检查是否设置了命令行参数可以[%1]==[],但是,正如Dave Costa 指出的那样"%1"==""也可以。

我还修复了用法 echo 中的语法错误以转义大于和小于符号。此外,exit需要一个/B参数否则CMD.exe将退出。

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
于 2009-05-06T16:45:37.097 回答
24
于 2016-01-01T01:42:51.793 回答
16

去掉括号。

示例批处理文件:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

运行上述脚本的输出:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

我认为它实际上是把括号作为字符串的一部分,并且它们正在被比较。

于 2009-05-06T16:51:05.380 回答
6
IF "%~1"=="" GOTO :Usage

如果引用了 %1 本身, ~ 将取消引用 %1。

" " 将防止传递的特殊字符。例如使用 &ping 调用脚本

于 2014-11-24T16:50:50.790 回答
3

这与其他答案相同,但仅使用一个标签并将用法放在首位,这也使其作为脚本的一种文档推荐,通常也位于顶部:

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

但是,如果您不必使用 cmd/batch,在 WSL 或 powershell 上使用 bash,它们的语法更健全,神秘功能更少。

于 2018-12-27T16:13:29.673 回答
1
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
于 2012-05-01T21:52:55.540 回答
0

IF "%1"=="" 将失败,在某些有毒字符条件下,所有版本都会失败。只有 IF DEFINED 或 IF NOT DEFINED 是安全的

于 2017-12-26T18:33:42.773 回答