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

时间:2014-05-21 05:50:24

标签: windows batch-file special-characters command-line-arguments

我有一个部署脚本,我必须将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 "
然而,它不会起作用。

2 个答案:

答案 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?