我正在尝试在批处理文件中使用以下验证逻辑,但即使没有向批处理文件提供参数,“使用”块也不会执行。
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
我究竟做错了什么?
我正在尝试在批处理文件中使用以下验证逻辑,但即使没有向批处理文件提供参数,“使用”块也不会执行。
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
我究竟做错了什么?
检查是否设置了命令行参数可以[%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
去掉括号。
示例批处理文件:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
运行上述脚本的输出:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
我认为它实际上是把括号作为字符串的一部分,并且它们正在被比较。
IF "%~1"=="" GOTO :Usage
如果引用了 %1 本身, ~ 将取消引用 %1。
" " 将防止传递的特殊字符。例如使用 &ping 调用脚本
这与其他答案相同,但仅使用一个标签并将用法放在首位,这也使其作为脚本的一种文档推荐,通常也位于顶部:
@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,它们的语法更健全,神秘功能更少。
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
IF "%1"=="" 将失败,在某些有毒字符条件下,所有版本都会失败。只有 IF DEFINED 或 IF NOT DEFINED 是安全的