java - 命令行参数缺少特殊字符,例如!当通过 Inno Setup 中的批处理文件运行时
问题描述
我们有一个奇怪的设置来运行 Java 代码,这绝不是理想的设置,但它是遗留设置的一部分,最近我的团队被分配了一个存在很长时间的错误。
我们有一个 Inno Setup 安装程序,它在复制文件后运行一个批处理文件。在批处理文件中,我们有如下命令:
java -cp :;* JavaClassName %1 %2 %3 %4
这%4
是一个密码字段,它应该包含特殊字符。当我们在批处理文件上打开 echo 并在 java 代码运行后暂停文件时,我们可以看到该命令看起来很完美,如下所示:
java -cp :;* JavaClassName "param1" "param2" "param3" "Passw0rd!"
在 Java 代码的第一行,我们做了 aSystem.out.println(args[3])
并输出:
密码
令人惊讶的是,当我们从控制台复制命令并从非 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!"
输出是:
“sg”
解决方案
您的问题显然是延迟扩展(所以只有!
)。您可能打开了延迟扩展。默认是off,所以我实际上没有遇到你的问题。
它在“不同的控制台”中工作的可能原因是您为 32 位和 64 位控制台设置了不同的延迟扩展(我不确定它是否真的可能,但它可能是,因为我没有见任何其他解释)。而您的普通控制台可能是 64 位的。但由于 Inno Setup 是 32 位的,它启动 32 位控制台。
按照上面的链接查看如何重置延迟扩展。或者您可以使用以下命令仅为您的批处理文件关闭延迟扩展:setlocal
setlocal disabledelayedexpansion
java -cp :;* JavaClassName %1 %2 %3 %4
推荐阅读
- linux - 是否可以在 coreos 上禁用幽灵/熔毁/相关补丁?
- angular - 使用 filter、groupby 和 orderby 映射 json 数组的值
- html - 图像在轮播中拉伸
- linkedin - LinkedIn 分享按钮不分享确切的帖子
- php - 在特定 Woocommerce 产品类别存档页面下添加文本
- javascript - 同构样式加载器,无法读取 null 的属性“应用”
- jquery - 动态更改工具提示自定义类
- javascript - 计算特定对象属性值(如果它们匹配)
- sql - 第二个左外连接没有使用 Spark 返回正确的行数
- node.js - Angular 2+ http.get() 卡在挂起状态