在 Windows 上通过 PowerShell 设置环境变量依赖于其他环境变量

3
我希望设置一个变量,比如JAVA_HOME,动态地假设另一个变量JAVA_HOME_x64的值,以便每当JAVA_HOME_x64更改并创建新的终端会话时,JAVA_HOME都会被分配为JAVA_HOME_x64的值。在powershell中,我执行以下操作...
[System.Environment]::SetEnvironmentVariable('JAVA_HOME', '%JAVA_HOME_x64%', 'Machine');
[System.Environment]::SetEnvironmentVariable('JAVA_HOME_x64', 'c:\myjava', 'Machine');
[System.Environment]::GetEnvironmentVariable('JAVA_HOME', 'Machine') ==> returns %JAVA_HOME_x64% 

当我打开一个新的命令提示符并输入set(或echo %JAVA_HOME%)时,它显示JAVA_HOME的值为%JAVA_HOME_x64%,而不是c:\myjava。
然而,如果我进入UI(如下所示)并手动编辑(删除和重新创建)JAVA_HOME并将其值重置为%JAVA_HOME_x64%,然后启动一个新的命令提示符/终端会话,它现在显示JAVA_HOME的值为c:\myjava。为什么?有什么想法吗?如何通过PowerShell命令实现与UI中相同的行为。 Set enviroment variable manually via UI 经过一些调查,我意识到,通过上述PowerShell命令行创建的注册表键(位于Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)对于所说的变量来说是REG_SZ类型,而通过UI创建的那个是REG_EXPAND_SZ类型。这可能是线索。

我尝试查看了这个 https://stackoverflow.com/questions/50607618/create-user-environment-variable-with-expandable-value,但对我仍然不起作用。 - hardeep
我认为这个问题需要进行一些更正。在命令中,JAVA_HOME 没有设置为 c:\myjava。另外,你所说的“任何新的”命令是指哪些命令?请更新问题并分享更多信息。 - alexzelaya
@alexzelaya,我想动态设置JAVA_HOME的值为JAVA_HOME_x64的值,即如果将来JAVA_HOME_x64更改,JAVA_HOME将自动更新。 - hardeep
这在你的问题中没有得到体现。https://stackoverflow.com/help/how-to-ask - alexzelaya
只有当我通过UI为变量JAVA_HOME设置完全相同的值,即%JAVA_HOME_x64%,这才能正常工作。 - hardeep
显示剩余4条评论
1个回答

2
以下内容是有效的...
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' 'JAVA_HOME' '%JAVA_HOME_x64%' -Type 'ExpandString'

[System.Environment]::SetEnvironmentVariable('JAVA_HOME_x64','c:\program files\Zulu\jre','Machine')

在使用_Set-ItemProperty_之后,使用_SetEnvironmentValue_设置用作REG_EXPAND_SZ的变量非常重要 - 否则它不会在cmd.exe中被“刷新”,但在GUI中将显示为新值,在退出GUI后,cmd.exe也将看到新值。 - Nyuno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接