【问题标题】:Why doesn't shell %variable% work when set from PowerShell?为什么从 PowerShell 设置时 shell %variable% 不起作用?
【发布时间】:2012-09-26 05:08:27
【问题描述】:

我在我的PATH 变量中插入一个变量字符串。我按以下方式设置变量:

$var="MyTestPath"
$mypath=[environment]::GetEnvironmentVariable("PATH",[system.environmentvariabletarget]::User) 
[environment]::SetEnvironmentVariable("TEST",$var,[system.environmentvariabletarget]::User)
[environment]::SetEnvironmentVariable("PATH",$mypath+";%TEST%",[system.environmentvariabletarget]::User) 

上面的代码对我不起作用。当我检查新 shell 中的路径时,%TEST% 变量不会自行扩展。它显示以%TEST% 结尾的新路径。当我从 GUI 或 Windows shell 提示符设置它时,这一直有效。当从 PowerShell 设置变量时,为什么这种行为会有所不同? PowerShell 中是否删除了此功能?

不想执行以下操作,因为它会在我每次运行脚本时不断将我的变量添加到路径中。

[environment]::SetEnvironmentVariable("PATH",$mypath+";"+$var,[system.environmentvariabletarget]::User) 

【问题讨论】:

    标签: powershell windows-shell


    【解决方案1】:

    尝试更改此行:

    [environment]::SetEnvironmentVariable("PATH",$mypath+";%TEST%",[system.environmentvariabletarget]::User) 
    

    与:

    $test =[environment]::GetEnvironmentVariable("test","user") # this retrieve the rigth variable value
    [environment]::SetEnvironmentVariable("PATH", $mypath +";$test",[system.environmentvariabletarget]::User) 
    

    %test%在powershell中没有意义,不能像CMD那样展开。

    $env:test 仅从系统环境变量中检索,而不是从用户中检索

    【讨论】:

    • 上面在我的路径末尾添加了;%TEST%,但它没有扩展到它的值。
    • 谢谢@Christian。我在我的问题中提到我不想采用这种方法。每次我运行脚本时,这都会继续将以前的PATH 附加到新的PATH。 ($mypath 是从用户 path 变量中读取的)。我只想设置一次PATH=somepath;%TEST%,并在需要时不断更改TEST,从而自动更改PATH。但由于cmd 无法扩展%TEST%,这对我来说并不奇怪。我希望这不会令人困惑。
    • @Alok 您可以检查path 变量是否包含$var,然后再将其设置为path 变量以避免重复每个脚本的执行。如果我很好地理解了您的需求。祝你好运
    • 轻松删除 $var 并不是很简单。 var 由至少 15 条不同的路径组成。有时我会更改 var 中的现有路径,在这种情况下,我必须维护旧的 var 和新的 var,这会使事情复杂化。我不希望powershell 扩展%TEST%,但我只想将path 设置为somepath;%TEST%。对于powershell,这只是一个字符串,但是当我打开CMD terminal 时,我希望这个变量会被扩展,但它不会发生。这让我很困惑。为什么cmd 在从 GUI 或 cmd 设置时区分 %TEST% 与从powershell 设置相同字符串时区分@
    • 我猜这个问题更多是针对windows shell 社区而不是powershell 社区。 powershell 行为正常,但 windows shell 行为不正常。我希望有人以前经历过。
    【解决方案2】:

    您希望有效地设置使用 REG_EXPAND_SZ 的注册表值(对应于 env var)。看到这个post for details on how to do that

    【讨论】:

    • 感谢您的回复基思。我尝试使用链接中的方法设置注册表变量。我将TEST 变量设置为[Microsoft.Win32.Registry]::SetValue("HKEY_CURRENT_USER\Environment","TEST","MyTestString",[Microsoft.Win32.RegistryValueKind]::ExpandString) 有趣的是,powershell 正在返回这个变量的正确值,但是如果我打开一个新的Windows shell 并使用echo %TEST% 查找TEST 的值,它会返回一个旧值.我想我必须进一步了解 Windows shell 在扩展 %TEST% 时从哪里读取 TEST 变量的值。
    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多