运行以下最小示例:
(
echo if "%%1" == "" (
echo echo Success ^|^| goto :fail
echo ^) else (
echo echo Failure ^|^| goto :fail
echo ^)
) >"testresult.bat"
call "testresult.bat" "first 1" --flag="other options" --verbose
将以下内容作为testresult.bat
的内容:
if "%1" == "" (
echo Success || goto :fail
) else (
echo Failure || goto :fail
)
然后使用命令行参数testresult.bat
调用"first 1" --flag="other options" --verbose
会给我:
C:\User>test.bat
C:\User>(
echo if "%1" == "" (
echo echo Success || goto :fail
echo ) else (
echo echo Failure || goto :fail
echo )
) 1>"testresult.bat"
C:\User>call "testresult.bat" "first 1" --flag="other options" --verbose
1"" was unexpected at this time.
C:\User>if ""first 1"" == "" (
C:\User>
由于我的第一个参数用双引号引起了错误1"" was unexpected at this time.
。
如何正确地写if "%1" == ""
来检查第一个参数是否为空,而不管它是否带有双引号?
答案 0 :(得分:3)
这里的问题是用"%1"
而不是"%~1"
引用参数1。
在Windows命令提示符窗口call /?
中运行时获得的帮助输出说明%1
引用了传递给批处理文件的第一个参数,而没有或用双引号引起来。
因此,将字符串"first 1"
作为创建的批处理文件的第一个参数传递会导致 IF 条件,其中""first 1""
留给比较运算符==
是 IF 条件下的严重语法错误。
通常使用的解决方案是在 IF 命令行上使用"%~1"
。如果根本没有双引号,则修饰符~
会导致从第一个参数字符串中删除包围的"
。因此,在 IF 条件下的第一个字符串现在几乎总是正确的,并用一对双引号引起来。
可以使用if "%~1" == ""
调用批处理文件,第一个参数为:
argument1
...由于"
不必要而未用引号括起来。"argument 1"
...由于空格字符而引用了参数字符串。""
...空字符串作为参数字符串。"argument 1
...仍然不正确,但在使用%~1
作为开头的单个"
时,带空格字符的引号引数字符串仍然有效。argument1"
...引号参数字符串不正确。"
,因为导致的命令行为if "%~1" == ""
,从而导致命令行if "argument1"" == ""
上出现语法错误。在What is the difference between "…" and x"…" in an IF condition in a Windows batch file?上查看我的答案,它详细说明了如何编写甚至在最后一个参数示例中都可以使用的批处理文件。