我应该如何传递密码(包含特殊字符)作为命令行参数?

我有一个部署脚本,我必须通过LDAP密码作为cmd参数。

实际密码: foo\$ser"ver\\ 1 (包含三个空格字符:开头,前1和后1

例如

 ...bin>deployment.bat LDAPPassword= foo\$ser\"ver\\ 1 

注意:如开始处所示,密码中有空格。

deployment.bat调用上述参数作为parameter passing给的类。 问题是这个类收到两个不同的论点:

 args[0]= foo\$ser"ver\\ //The space after \\ is omitted args[1]=1 //The space before and after 1 is omitted 

我如何传递这个密码以便它被作为单个string接收?

我已经尝试引用密码

 ...bin>deployment.bat LDAPPassword=" foo\$ser"ver\\ 1 " 

但它不会工作。

Solutions Collecting From Web of "我应该如何传递密码(包含特殊字符)作为命令行参数?"

你无法以任何方式逃避你的密码。
由于引号和空格的组合不能放在一个参数中。

就像这个"<space><quote><space> )即使添加了一些引号,即使引用空格和引号本身也是不可能的。

 myBat " myBat " " " myBat ^ " myBat ^"^ ^"^ ^" 

这里是最好加倍你的密码内的所有报价,并把你的密码引号。
那么你可以使用其他所有的字符都没有任何问题。

deployment.bat“foo \ $ ser \”“ver \ 1”

并在deployment.bat

 @echo off setlocal DisableDelayedExpansion set "pwd=%~1" setlocal EnableDelayedExpansion set "pwd=!pwd:""="!" echo pwd='!pwd!' 

只有延迟扩展才能使用密码,以避免特殊字符出现问题。

为了访问命令行参数,你也可以看看
SO:如何接收最奇怪的命令行参数?

 " foo\$ser\"ver\ 1 " 

引用完整的字符串,你需要转义的报价,所以它不被视为结束报价。

而且在引号前面加了一个反斜杠的情况下,你也必须避开反斜线。 所以密码为

 this isa\"test 

应该写成

 "thisisa\\\"test" 

有关更多信息, 这是在Windows中解析参数的“常用”方法。

编辑 – 只是为了记录测试。 使用这个批处理文件( test.cmd

 @echo off cls echo(-------------------------------------------- echo [%1][%2][%3][%4][%5][%6][%7][%8][%9] echo(-------------------------------------------- cmdline.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 echo(-------------------------------------------- cmdline.exe %* echo(-------------------------------------------- java CmdLine %1 %2 %3 %4 %5 %6 %7 %8 %9 echo(-------------------------------------------- java CmdLine %* echo(-------------------------------------------- 

cmdline.exe是从这个c代码中获得的

 #include "windows.h" #include "stdio.h" void main(int argc, char **argv){ int i; printf("cmdline:[%s]\r\n\r\n",GetCommandLine()); for(i = 0; i < argc ; i++) printf("arg_%03d:[%s]\r\n",i,argv[i]); }; 

和CmdLine.java是

 public class CmdLine { public static void main (String[] args) { int i = 0; for (String s: args) { System.out.println(String.format("arg_%03d:[%s]",++i,s)); } } } 

运行test.cmd " foo\$ser\"ver\ 1 "的结果是

 -------------------------------------------- [" foo\$ser\"ver\][1]["][][][][][][] -------------------------------------------- cmdline:[cmdline.exe " foo\$ser\"ver\ 1 " ] arg_000:[cmdline.exe] arg_001:[ foo\$ser"ver\ 1 ] -------------------------------------------- cmdline:[cmdline.exe " foo\$ser\"ver\ 1 "] arg_000:[cmdline.exe] arg_001:[ foo\$ser"ver\ 1 ] -------------------------------------------- arg_001:[ foo\$ser"ver\ 1 ] -------------------------------------------- arg_001:[ foo\$ser"ver\ 1 ] --------------------------------------------