当第一个命令行参数被双引号引起时,错误'1“”在此时是意外的。

时间:2019-11-15 21:50:59

标签: batch-file

运行以下最小示例:

(
    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" == ""来检查第一个参数是否为空,而不管它是否带有双引号?

1 个答案:

答案 0 :(得分:3)

这里的问题是用"%1"而不是"%~1"引用参数1。

在Windows命令提示符窗口call /?中运行时获得的帮助输出说明%1引用了传递给批处理文件的第一个参数,而没有或用双引号引起来。

因此,将字符串"first 1"作为创建的批处理文件的第一个参数传递会导致 IF 条件,其中""first 1""留给比较运算符== IF 条件下的严重语法错误。

通常使用的解决方案是在 IF 命令行上使用"%~1"。如果根本没有双引号,则修饰符~会导致从第一个参数字符串中删除包围的"。因此,在 IF 条件下的第一个字符串现在几乎总是正确的,并用一对双引号引起来。

可以使用if "%~1" == ""调用批处理文件,第一个参数为:

  1. argument1 ...由于"不必要而未用引号括起来。
  2. "argument 1" ...由于空格字符而引用了参数字符串。
  3. "" ...空字符串作为参数字符串。
    尽管批处理文件使用参数字符串运行,但条件为true。大多数需要一个或多个参数字符串的批处理文件不允许参数字符串之一为空字符串。但是某些批处理脚本还支持空参数字符串。
  4. "argument 1 ...仍然不正确,但在使用%~1作为开头的单个"时,带空格字符的引号引数字符串仍然有效。
  5. argument1" ...引号参数字符串不正确。
    Windows命令处理器不会删除不正确的指定参数字符串末尾的",因为导致的命令行为if "%~1" == "",从而导致命令行if "argument1"" == ""上出现语法错误。

What is the difference between "…" and x"…" in an IF condition in a Windows batch file?上查看我的答案,它详细说明了如何编写甚至在最后一个参数示例中都可以使用的批处理文件。