通过命令行向Java程序传递感叹号

3
我希望将字符串“!changeme!”传递给Java程序,方式是通过命令行进行,例如:
java -cp "!AXIS2_CLASS_PATH!" ClientJava --userid admin --passwd "!changeme!"

使用Windows XP,Java jdk 1.6.0_07。

我认为AXIS2_CLASS_PATH被Java运行时正常替换。但是,!changeme!的密码似乎也被替换为空字符串。我猜测这种替换是JVM的某种特性。

使用以下程序:

static int Run(String[] aArgs) {
    for (String s: aArgs) {
        System.out.println("arg: " + s);
    }
    return 0;
}

我得到了以下结果:
"C:\Program Files\Java\jdk1.6.0_07\bin\java" -cp "!AXIS2_CLASS_PATH!"
    ClientJava --userid admin --passwd "!changeme!"
arg: --userid
arg: admin
arg: --passwd
arg:

我希望密码能够原样传递。我尝试了各种转义,但没有找到需要使用的内容。

有人能提供如何做到这一点的提示吗?

解决方案,由Zach Scrivena提供:

使用插入符号(^)转义感叹号(!)。

java -cp "!AXIS2_CLASS_PATH!" ClientJava --xxx "^!changeme^!"

arg: --userid
arg: admin
arg: --passwd
arg: !changeme!

1
你所处的环境是用什么替换 !foo! 的?我强烈怀疑这个问题与Java无关,而与你所在的shell环境有关。 - Jon Skeet
使用Windows XP。在Windows中没有任何东西可以进行这种替换。我相信是JVM,但如果有解决方案,我很乐意被证明是错误的。 - brofield
1个回答

6
问题是由命令行解释器引起的---它用相应的环境变量替换括在感叹号!中的术语。只需在每个转义字符前加上插入符号^即可解决此问题。这适用于命令行和批处理文件。
java -cp "!AXIS2_CLASS_PATH!" ClientJava --xxx "^!changeme^!"

在命令行中,您也可以用双引号"将每个转义字符括起来。
java -cp "!AXIS2_CLASS_PATH!" ClientJava --xxx ""!"changeme"!""

--passwd ""!"changeme"!"" 不起作用(=“一个双引号),但是--passwd "^!changeme^!" 可以得到所需的字符串。谢谢。 - brofield
%FOO% 和 !FOO! 有什么区别? - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接