使用可扩展值

时间:2018-05-30 14:46:48

标签: windows powershell environment-variables

我可以轻松地在 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变量只通过脚本工作?

2 个答案:

答案 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 参数允许使用可扩展变量。