windows - 通过 powershell 将环境变量设置为依赖于 Windows 上的其他环境变量

标签 windows powershell environment-variables

我想设置一个变量 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 中相同的行为。 Set enviroment variable manually via 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/

相关文章:

windows - 如何在CreateProcess实例化的命令中使用或扩展环境变量?

python - Windows 上的 fcntl 替代品

c# - Encoding.ASCII.GetString 返回空白值(仅在 Windows 应用程序中)

c++ - VS2008 远程调试器 : An attempt was made to access a socket in a way forbidden by its access permissions

windows - 在 Windows cmd Null Pointer Exp 上启动 Glassfish4

.net - Seek 方法在 Powershell 脚本中不起作用

powershell - 将联系人导入Exchange个人联系人文件夹

powershell - PowerShell 脚本 block 内的命令执行顺序

bash - 什么是特殊的美元符号 shell 变量?

.htaccess 和环境变量(如果没有 Env,则执行 X)