命令行参数缺少特殊字符,例如 ! 当通过 Inno 安装程序的批处理文件运行时



我们有一个奇怪的设置来运行Java代码,这绝不是理想的设置,但它是遗留设置的一部分,最近我的团队被分配了一个长期存在的错误。

我们有一个Inno Setup安装程序,它在复制文件后运行批处理文件。在批处理文件中,我们有一个命令,如下所示:

java -cp :;* JavaClassName %1 %2 %3 %4

这里%4是一个密码字段,它应该包含特殊字符。当我们在批处理文件上打开 echo 并在 java 代码运行后暂停文件时,我们可以看到该命令看起来很完美,如下所示:

java -cp :;* JavaClassName "param1" "param2" "param3" "Passw0rd!"

在 Java 代码的第一行,我们做了一个System.out.println(args[3]),它输出:

Passw0rd

令人惊讶的是,当我们从控制台复制命令并从未由 inno 脚本打开的其他控制台运行它时,整个事情运行良好,我们得到输出:

咔嚓!

我们从 inno 脚本触发批处理的方式如下所示:

Exec('path_to_bat_file.bat', '"all" "the" "params" "quoted" "properly"','', SW_SHOW, ewWaitUntilTerminated, ResultCode); 

谁能帮我理解为什么在这里观察到这种行为?

提前感谢!


这个问题在没有 java 调用的情况下也是可以重现的。我尝试了以下代码:

test.bat %1 %2 %3 %4

内部test.bat

echo %4

它看起来像:

echo "sg!#$@001!"

输出为:

"嘟嘟">

您的问题显然与延迟扩展有关(因此仅使用!(。您可能已打开延迟扩展。 默认值是关闭的,所以我实际上没有遇到你的问题。

它在"不同的控制台">中工作的可能原因是您对 32 位和 64 位控制台的延迟扩展设置不同(我不确定这是否真的可能,但可能是,因为我没有看到任何其他解释(。您的普通控制台可能是 64 位的。但由于 Inno Setup 是 32 位的,它会启动 32 位控制台。

按照上面的链接查看如何重置延迟扩展。或者,您可以使用以下命令仅为批处理文件关闭延迟扩展setlocal

setlocal disabledelayedexpansion
java -cp :;* JavaClassName %1 %2 %3 %4

最新更新