我想设置一个变量 JAVA_HOME 来动态假设另一个变量的值,例如 JAVA_HOME_x64..这样每当 JAVA_HOME_x64 发生变化并创建一个新的终端 session 时,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%,然后当启动新的命令提示符/终端 session 时,它现在将 JAVA_HOME 的值显示为c:\myjava..为什么这样?有任何想法吗?如何通过 PowerShell 命令实现与 UI 中相同的行为。
经过一些调查,我意识到,通过上面的 powershell 命令行为上述变量创建的注册表项(在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 中)是 REG_SZ 类型,而通过 UI 创建的是是 REG_EXPAND_SZ。这可能是线索
最佳答案
以下有效..
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')
关于windows - 通过 powershell 将环境变量设置为依赖于 Windows 上的其他环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67818615/