windows - 以编程方式附加到 Windows 中所有用户的路径。

标签 windows powershell path chef-infra chef-solo

我在 chef 中附加到 windows 路径,但它只反射(reflect)给管理员(用于管理员附加到路径)

# 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 用户可用?

最佳答案

我没有使用 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

关于windows - 以编程方式附加到 Windows 中所有用户的路径。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379722/

相关文章:

java - 访问具有名称的文件的正确方法

java - Jar 文件崩溃但 netbeans 项目可以工作

Powershell:获取目录中最后一个按字母数字排序的文件的路径

java - 执行java应用程序的批处理文件

powershell - 开始/处理/结束如何节省对foreach的需求?还需要该参数吗?

powershell - 检查字符串中的特殊字符

azure - 为什么 Get-AzKeyVaultSecret 返回 "No Such Host Is Known"?

C++ 特殊字符显示为 "?"

Windows Batch 认为凌晨 2 点是下午 5 点之后

c# - 在 C# 中更改系统图标