【问题标题】:append to path for all users in windows programmatically.以编程方式附加到 Windows 中所有用户的路径。
【发布时间】:2016-07-22 15:23:10
【问题描述】:

我在 Chef 中附加到 Windows 路径,但它只反映给管理员(用于管理员附加到路径)

# append dnx.exe to %PATH%
windows_path '%USERPROFILE%\\.dnx\\runtimes\\dnx-coreclr-win-x64.1.0.0-rc1-update1\\bin' do
  action :add
end

是否有一个命令可以附加到路径并以编程方式使其可供所有 Windows 用户使用?

【问题讨论】:

    标签: windows powershell path chef-infra chef-solo


    【解决方案1】:

    我没有使用 Chef 的经验,但是为所有用户向 PATH 环境变量添加内容的规范方法是将其附加到机器环境中的变量而不是用户环境中。在 PowerShell 中,您可以这样做:

    $path = [Environment]::GetEnvironmentVariable('PATH', 'Machine')
    $path += ';%USERPROFILE%\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-rc1-update1\bin'
    [Environment]::SetEnvironmentVariable('PATH', $path, 'Machine')
    

    如果你想将它合并到一个语句中,它看起来有点像这样:

    [Environment]::SetEnvironmentVariable('PATH', ([Environment]::GetEnvironmentVariable('PATH', 'Machine') + ';%USERPROFILE%\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-rc1-update1\bin'), 'Machine')
    

    但是,您可能不想简单地附加到变量,因为这可能会不断地一遍又一遍地添加变量的路径。为避免这种情况,您可以执行以下操作:

    $dir  = '%USERPROFILE%\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-rc1-update1\bin'
    $path = [Environment]::GetEnvironmentVariable('PATH', 'Machine') -split ';' |
            Where-Object { $_ -ne $dir }
    $path += $dir
    [Environment]::SetEnvironmentVariable('PATH', ($path -join ';'), 'Machine')
    

    编辑:我刚刚意识到[Environment]::SetEnvironmentVariable() 不能用于您的情况。虽然该方法会将变量设置为您传递给它的字符串,但该字符串将作为REG_SZ 值存储在注册表中。这将防止字符串中的变量(如%USERPROFILE%)在查找路径时被扩展,从而使整个事情变得毫无意义。

    为了避免这个陷阱,您必须确保路径存储在 REG_EXPAND_SZ 值中,例如像这样:

    $regkey = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
    Set-ItemProperty -Path $regkey -Name 'Path' -Value $path -Type ExpandString
    

    【讨论】:

    • 完美,正是我想要的!
    • 另外,$newpath 有什么用?我没有看到它在任何地方使用或生成。不断向 $path 中添加空白值
    • 你是说,$path += $dir
    • 是的,我做到了。决定在发布之前重命名变量,但显然错过了一次。
    • 这可以很好地保留添加的新变量。但需要注意的是,Path 中的原始变量在从注册表读取到$path 时会丢失。原来的%SystemRoot% 被硬编码为C:\Windows(或者你系统上的任何东西)等等。只有你添加的那些会被保留。
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    相关资源
    最近更新 更多