命令行参数缺少特殊字符,如 !当 运行 通过 Inno Setup 的批处理文件时
Command line parameters missing special characters like ! when ran via batch file from Inno Setup
我们对 运行 Java 代码进行了奇怪的设置,这绝不是理想的设置,但它是遗留设置的一部分,最近我的团队被分配了一个错误存在了很长时间。
我们有一个 Inno Setup 安装程序,它 运行 是复制文件后的批处理文件。在批处理文件中,我们有如下命令:
java -cp :;* JavaClassName %1 %2 %3 %4
这里%4
是一个密码字段,它应该包含特殊字符。当我们在批处理文件上打开回显并在 java 代码 运行s 后暂停文件时,我们可以看到该命令看起来很完美:
java -cp :;* JavaClassName "param1" "param2" "param3" "Passw0rd!"
在Java代码的第一行,我们做了一个System.out.println(args[3])
,它输出:
Passw0rd
令人惊讶的是,当我们从控制台复制命令并从另一个未被 inno 脚本打开的控制台 运行 复制命令时,整个过程工作正常,我们得到输出:
Passw0rd!
我们从 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!"
输出为:
"sg"
您的问题显然与 delayed expansion 有关(因此仅与 !
有关)。您可能 启用了延迟扩展 。默认是关闭,所以我其实没有遇到你的问题。
它在 "different console" 中工作的可能原因是您为 32 位和 64 位控制台设置了不同的延迟扩展 (我不确定这是否真的可能,但可能是,因为我没有看到任何其他解释)。而您的普通控制台可能是 64 位的。但由于 Inno Setup 是 32 位的,它会启动 32 位控制台。
按照上面的link,看看如何重置延迟展开。或者您可以使用 setlocal
command:
为您的批处理文件关闭延迟扩展 off
setlocal disabledelayedexpansion
java -cp :;* JavaClassName %1 %2 %3 %4
我们对 运行 Java 代码进行了奇怪的设置,这绝不是理想的设置,但它是遗留设置的一部分,最近我的团队被分配了一个错误存在了很长时间。
我们有一个 Inno Setup 安装程序,它 运行 是复制文件后的批处理文件。在批处理文件中,我们有如下命令:
java -cp :;* JavaClassName %1 %2 %3 %4
这里%4
是一个密码字段,它应该包含特殊字符。当我们在批处理文件上打开回显并在 java 代码 运行s 后暂停文件时,我们可以看到该命令看起来很完美:
java -cp :;* JavaClassName "param1" "param2" "param3" "Passw0rd!"
在Java代码的第一行,我们做了一个System.out.println(args[3])
,它输出:
Passw0rd
令人惊讶的是,当我们从控制台复制命令并从另一个未被 inno 脚本打开的控制台 运行 复制命令时,整个过程工作正常,我们得到输出:
Passw0rd!
我们从 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!"
输出为:
"sg"
您的问题显然与 delayed expansion 有关(因此仅与 !
有关)。您可能 启用了延迟扩展 。默认是关闭,所以我其实没有遇到你的问题。
它在 "different console" 中工作的可能原因是您为 32 位和 64 位控制台设置了不同的延迟扩展 (我不确定这是否真的可能,但可能是,因为我没有看到任何其他解释)。而您的普通控制台可能是 64 位的。但由于 Inno Setup 是 32 位的,它会启动 32 位控制台。
按照上面的link,看看如何重置延迟展开。或者您可以使用 setlocal
command:
setlocal disabledelayedexpansion
java -cp :;* JavaClassName %1 %2 %3 %4