引用逗号分隔参数结果“命令的语法不正确”

问题描述:

我已经花了几个小时来回,并且我退出了!我只是想从命令行读取参数。在我将双引号和逗号分隔符引入命令行调用之前,这一切都正常工作。虽然我认为真正的问题与这些逗号有关,但不确定发生了什么,希望有人能够提供帮助? :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基本上都是我的这个调试;所以让我复制/粘贴的输出,你会看到它在越来越挂断:

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 
+0

哇,谢谢;如何知道何时将引号放在完整的变量和赋值中?或者应该总是这样做? – nuebKitsune

+0

为了避免尾随的空格和由有害字符引起的断裂 - 是的。如果在var中有空格,用'[]'括起来的操作数也无济于事,所以尽可能使用双引号。与hostinstances的调用需要引用,因为','会分成几个参数。 – LotPings