我可以轻松地在 Powershell脚本(Windows 10)中创建用户环境变量。
[System.Environment]::SetEnvironmentVariable('name', 'value', 'User')
如果变量包含其他用户环境变量,例如%OTHERVAR%;static_part
,我发现该类型必须为ExpandString
。这可以按如下方式完成
Set-ItemProperty HKCU:\Environment 'name' 'value' -Type ExpandString
所以,我写了以下代码
[System.Environment]::SetEnvironmentVariable('M2_HOME', 'C:\dev\app\apache-maven-3.3.9', 'User')
# special treatment to get expandable type
Set-ItemProperty HKCU:\Environment 'PATH' '%M2_HOME%\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;' -Type ExpandString
Write-Host ([System.Environment]::GetEnvironmentVariable('M2_HOME', 'User'))
Write-Host ([System.Environment]::GetEnvironmentVariable('PATH', 'User'))
Write-Host
输出:
C:\dev\app\apache-maven-3.3.9
C:\dev\app\apache-maven-3.3.9\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;
一切都很好看,两个变量都存在。当我打开Windows控件来编辑用户环境变量时,我看到两个变量并且扩展了PATH的值。即使在regedit
中,我也看到变量的类型是正确的。
但是,当我打开一个新的cmd
并尝试从%M2_HOME%\bin
运行二进制文件时(现在应该在PATH
上),它失败即可。
要手动解决问题,我只需要打开Windows控件来编辑用户环境变量,双击PATH
变量,不编辑任何内容,然后再次关闭它(I猜它重写了。)
然后,在新的cmd
中,我可以从%M2_HOME%\bin
运行二进制文件。
任何想法如何让这个PATH
变量只通过脚本工作?
答案 0 :(得分:0)
感谢@PetSerAl。他对首先在[(propertyNameInsideTheComponent)]="propertyNameOutsideTheComponent"
变量前添加占位符字符串,然后创建以后完成占位符的环境变量的答案非常有效。
PATH
如果我在评论中理解他的解释是正确的,因为"正常" variable触发一个事件,该事件使用占位符立即更新变量。所以它在脚本完成后就可以正常工作了。
答案 1 :(得分:0)
任何使用 Environment.SetEnvironmentVariable() API 的程序(如 PowerShell)都会广播 WM_SETTINGCHANGE,通知系统它需要重新加载环境。然后任何新会话都可以访问更新的环境。这不会在您仅使用 Set-ItemProperty 时触发。
我强烈建议使用免费工具Rapid Environment Editor。它的命令行涵盖了关于环境变量管理的任何需求,它的 GUI 将一目了然地显示每个细节。
如果您想向现有变量添加新值,请注意测试其命令行不使用 -S 参数,因为它会覆盖任何以前的值。请改用 -I 或 -A。并且始终使用 -C 以避免重复和无效的值。 -E 参数允许使用可扩展变量。