我不太熟悉Windows桌面的编程,我正在试图弄清楚如何处理从Java调用.bat文件。我正在尝试使用Maven运行桌面Java程序作为jar文件在Citrix虚拟化环境中执行bash脚本。
最初的初始问题是UNC路径导致批处理文件无法找到,但我已经修改了路径,现在我能够找到批处理文件,但是在Citrix帐户中我禁用了cmd.exe使用,我担心我无能为力。
以下是它的工作原理:
1)用户通过program.jar文件启动程序用户检查更新
2)如果找到更新,则下载名为program_update.jar
的新jar文件,并将名为run_update.bat
的批处理文件复制到主程序目录。
3)在java程序中,调用以下命令:
Runtime.getRuntime().exec("cmd /c pushd " + FileName.installation + " && start run_update.bat && popd");
其中FileName.installation
是先前设置的属性,表示主安装目录。
run_update.bat
运行循环尝试用program.jar
替换program_update.jar
并在命令提示符中显示成功/失败消息。
当我在Citrix环境中运行它时,我收到以下消息:
'run_update.bat' is not recognized as an internal or external command, operable program, or batch file.
The command prompt has been disabled by your administrator.
此时,我可以点击run_update.bat
并成功运行该操作。
通过program.jar调用的自动更新在可访问cmd的普通Windows环境中工作。
我的问题
cmd /c <commands>
根本不能运行吗?mv
命令替换它自己。我用替代技术解决了自己的问题。事实证明,在Citrix环境中运行Runtime.getRuntime().exec("cmd /c pushd " + FileName.installation + " && start run_update.bat && popd");
是一个问题,因为访问cmd
是受限制的。我重写了它以使用Desktop类:
File exe = new File(FileName.installation + File.separator + "install_update.bat");
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().open(exe);
} else {
Runtime.getRuntime().exec("cmd /c pushd " + FileName.installation + " && start install_update.bat && popd");
}