带引号的逗号分隔参数导致 "The syntax of the command is incorrect"

Quoted Comma Delimited Parameter results in "The syntax of the command is incorrect"

我为此折腾了几个小时,我放弃了!我只是想从命令行读取一个参数。在我将双引号和逗号定界符引入命令行调用之前,它工作正常。虽然我认为真正的问题是这些逗号,但不确定发生了什么,希望有人能提供帮助? :3

命令行是这样的:

deploy.bat -pom=ui\main.pom -hostPassword=test1234 -hostInstances="myserver1.subdomain.com:150,myserver2.subdomain.com:151,myserver3.subdomain.com:153" -uploadAndInstall -useTargetBuild

然后在批处理文件中我有一个部分来读取参数并调用一个函数来传递 KEY/VAL 对以设置变量(如果有人知道更好的方法;请:)

rem parse all passed arguments
:ARGS
SET KEY=%1
SET VAL=%2
ECHO TRYING %KEY%=%VAL%
IF [%KEY%]==[] GOTO ARGE
ECHO HAVETOKEN
ECHO %KEY:~0,1%E
IF "%KEY:~0,1%"=="-" (
    ECHO HAVEKEY
    IF [%VAL%]==[] (
        ECHO NOVAL
        CALL :EARG %KEY% TRUE
    ) ELSE (
        IF "%VAL:~0,1%"=="-" (
            ECHO HAVEKEYNEXT
            CALL :EARG %KEY% TRUE
        ) ELSE (
            ECHO HAVEVAL
            CALL :EARG %KEY% %VAL%
            SHIFT /1
        )
    )
)
SHIFT /1
GOTO ARGS
:ARGE

中的ECHO基本上就是我对这个的调试;所以让我 copy/paste 输出,你会看到它挂在什么地方:

TRYING -pom=ui\main.pom
HAVETOKEN
-E
HAVEKEY
HAVEVAL
-pom ui\main.pom
TRYING -hostPassword=test1234
HAVETOKEN
-E
HAVEKEY
HAVEVAL
-hostPassword test1234
TRYING -hostInstances="myserver1.subdomain.com:150,myserver2.subdomain.com:151,myserver3.subdomain.com:153"
HAVETOKEN
-E
The syntax of the command is incorrect.

所以你可以看到它知道 -hostInstances 在那里,但它甚至不会 运行 这行代码(即使上面的行是相同的)IF "%KEY:~0,1%"=="-" (

  • 这是总是正确引用的问题。
  • 由于子 :EArg 丢失,我插入了一个在键前加上下划线以简化输出的子。

@Echo off
rem parse all passed arguments
:ARGS
SET "KEY=%~1"
SET "VAL=%~2"
IF "%KEY%"=="" GOTO ARGE
ECHO TRYING %KEY%=%VAL%
ECHO HAVETOKEN %KEY:~0,1%E
IF "%KEY:~0,1%"=="-" (
    ECHO HAVEKEY   %KEY:~1%
    IF "%VAL%"=="" (
        ECHO NOVAL
        CALL :EARG "%KEY:~1%" TRUE
    ) ELSE (
        IF "%VAL:~0,1%"=="-" (
            ECHO HAVEKEYNEXT %VAL%
            CALL :EARG "%KEY:~1%" TRUE
        ) ELSE (
            ECHO HAVEVAL   %VAL%
            CALL :EARG "%KEY:~1%" "%VAL%"
            SHIFT /1
        )
    )
)
SHIFT /1
GOTO ARGS
:EArg
Set "_%~1=%~2"
Goto :EOF
:ARGE
Set _

示例输出:

> deploy.bat -pom=ui\main.pom -hostPassword=test1234 -hostInstances="myserver1.subdomain.com:150,myserver2.subdomain.com:151,myserver3.subdomain.com:153" -uploadAndInstall -useTargetBuild
TRYING -pom=ui\main.pom
HAVETOKEN -E
HAVEKEY   pom
HAVEVAL   ui\main.pom
TRYING -hostPassword=test1234
HAVETOKEN -E
HAVEKEY   hostPassword
HAVEVAL   test1234
TRYING -hostInstances=myserver1.subdomain.com:150,myserver2.subdomain.com:151,myserver3.subdomain.com:153
HAVETOKEN -E
HAVEKEY   hostInstances
HAVEVAL   myserver1.subdomain.com:150,myserver2.subdomain.com:151,myserver3.subdomain.com:153
TRYING -uploadAndInstall=-useTargetBuild
HAVETOKEN -E
HAVEKEY   uploadAndInstall
HAVEKEYNEXT -useTargetBuild
TRYING -useTargetBuild=
HAVETOKEN -E
HAVEKEY   useTargetBuild
NOVAL
_hostInstances=myserver1.subdomain.com:150,myserver2.subdomain.com:151,myserver3.subdomain.com:153
_hostPassword=test1234
_pom=ui\main.pom
_uploadAndInstall=TRUE
_useTargetBuild=TRUE