是否可以覆盖特定应用程序生命周期的任意 Windows 注册表项的值?
我希望可以使用命令行设置临时注册表值,以便我可以将它与以下批量临时环境变量更改相结合(指向 1.7 JDK)。C:\Windows\System32\cmd.exe /c "SET JAVA_HOME=C:\Program Files\Java\jdk1.7.0_75&& START /D ^"C:\Path\To\^" SpecialSnowflake.exe"
具体情况详情:
我正在使用一个需要 JDK 的程序(所以我有点迷失了)。编程的质量令人怀疑。我推测了 Process Monitor 中的相关事件,并拼凑出了一个可能的时间线。这些细节似乎与临时覆盖注册表值的任务无关,但为了以防万一,这里还是列出来:
当程序尝试选择并启动正确版本的 java.exe 时,它会检查注册表路径
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\java.exe
。据推测,程序希望这个看起来奇怪的键指向 Java 的最新版本(为什么不使用 Path 和/或 JAVA_HOME 变量?),但是,这个奇怪的键在我的任何一台电脑上都不存在。由于找不到该键,程序使用可能硬编码的 Java 默认路径,结果是 %windir%\SysWOW64\java.exe。这个特定的 java.exe 尚未被任何 1.8 JRE/JDK 安装程序触及,因此在我的电脑上仍然是过时的 1.7。这个 1.7 java.exe 被启动。它检查键HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment\CurrentVersion
,读取 1.8,然后终止自身。有问题的程序注意到了这一点,报告该键是 1.8,但应该是 1.7,并有帮助地提供了错误的从未检查过的键的注册表路径:('Software\JavaSoft\Java Runtime Environment'\CurrentVersion'
奇怪的'
字符不是我添加的)。