我有一个部署脚本,我必须将LDAP密码作为cmd参数传递。
实际密码: foo\$ser"ver\\ 1
(包含三个空格字符:开头,1
之前和1
之后)
e.g
...bin>deployment.bat LDAPPassword= foo\$ser\"ver\\ 1
注意:密码中有空格,如开头所示。
deployment.bat
调用上述参数作为参数传递的类。
问题是该类接收2个不同的参数:
args[0]= foo\$ser"ver\\ //The space after \\ is omitted
args[1]=1 //The space before and after 1 is omitted
如何传递此密码以便将其作为单个字符串接收?
我已尝试将密码引用为
...bin>deployment.bat LDAPPassword=" foo\$ser"ver\\ 1 "
然而,它不会起作用。
答案 0 :(得分:2)
" foo\$ser\"ver\ 1 "
要引用完整字符串,您需要转义引号,以便它不被视为结束引用。
如果引号已经加上反斜杠,那么你也必须逃避反斜杠。所以密码为
this isa\"test
应该写成
"thisisa\\\"test"
有关详细信息,this是"通常"在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(--------------------------------------------
从此c代码中获取cmdline.exe
#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 ]
--------------------------------------------
答案 1 :(得分:2)
您无法以任何方式逃避密码 由于某些带引号和空格的组合不能放在一个参数中。
就像这个"
(<space><quote><space>
)一样,即使你添加了一些引号,它也是不可能的,即使你引用了空格和引号本身。
myBat "
myBat " " "
myBat ^ "
myBat ^"^ ^"^ ^"
最好将密码中的所有引号加倍并将密码括在引号中 然后你可以使用所有其他字符没有任何问题。
deployment.bat&#34; foo \ $ ser \&#34;&#34; ver \ 1&#34;
在deployment.bat
中@echo off
setlocal DisableDelayedExpansion
set "pwd=%~1"
setlocal EnableDelayedExpansion
set "pwd=!pwd:""="!"
echo pwd='!pwd!'
您应该仅在延迟扩展时使用密码,以避免出现特殊字符问题。
要访问命令行参数,您还可以查看
SO: How to receive even the strangest command line parameters?