如何在 PowerShell 中获取用户环境变量?

2023-12-01

I see here,可以在 Windows PowerShell 中点源脚本。如何获取用户的环境变量(或者保存用户变量的文件路径)?

示例.ps1:

[Environment]::SetEnvironmentVariable("PATH", "C:\newapp\bin", "User")
newapp --do-something # fails until PS restart

环境变量存储在注册表中,而不是文件中,并且它们会在 PowerShell 启动时自动加载。没有什么可以点源的。您可以通过列出环境变量的内容来显示环境变量(用户环境与系统环境合并)env:PS驱动器:



PS C:\> Get-ChildItem env:

Name                           Value
----                           -----
ALLUSERSPROFILE                C:\ProgramData
APPDATA                        C:\Users\jsmith\AppData\Roaming
CommonProgramFiles             C:\Program Files\Common Files
...
  

环境变量与常规 PowerShell 变量的不同之处在于它们必须通过env范围前缀:



PS C:\> $username = 'foo'    # ← PowerShell variable
PS C:\> $username
foo
PS C:\> $env:username        # ← environment variable
jsmith
  

您可以通过更改变量来修改当前环境



PS C:\> $env:Path += ';C:\some\folder'    # append C:\some\folder to PATH
  

或完全替换它们:



PS C:\> $env:Path = 'C:\some\folder'      # set PATH to C:\some\folder
  

不建议操作环境变量,例如$env:USERNAME, 尽管。

但请注意,当您can修改环境变量或通过点源文件加载它们(在变量名称中使用正确的前缀)这些变量不会保留,因为它们仅应用于流程环境。

要对环境变量进行持久更改,您需要编辑注册表中的值

Set-ItemProperty -Path 'HKCU:\Environment' -Name 'foo' -Value 'bar' -Type String

或使用.Net API

[Environment]::SetEnvironmentVariable('foo', 'bar', 'User')

请注意,有pitfalls通过 API 更改注册表值。

使用setx命令行实用程序也可以工作,但我不建议这样做,因为语法并不像人们希望的那么简单,而且 PowerShell 首先不需要外部程序。

您还可以通过从注册表中重新读取其值来更新进程启动后更改的环境变量:

$env:foo = [Environment]::GetEnvironmentVariable('foo', 'User')

但请注意,Windows 将用户和系统环境存储在不同的位置。如果你有一个像这样的变量$env:Path这是在用户和系统环境中定义的,您需要组合这两个值:

$env:Path = [Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' +
            [Environment]::GetEnvironmentVariable('Path', 'User')

如果您需要为当前进程更改两个环境变量and坚持你需要执行这两项操作:更改$env:VARIABLE并将更改后的变量写回注册表。如果您需要多次执行此操作,则建议将这两个操作包装在自定义函数中,例如像这样:

function Set-EnvVariable {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [String]$Name,
        [Parameter(Mandatory=$true)]
        $Value,
        [Parameter(Mandatory=$false)]
        [String]$Type = 'String'
    )

    if (Test-Path -LiteralPath "env:$Name") {
        Set-Item "env:$Name" -Value $Value
    } else {
        New-Item -Path 'env:' -Name $Name -Value $value
    }

    Set-ItemProperty -Path 'HKCU:\Environment' -Name $Name -Value $Value -Type $Type
}

1 好吧,从技术上讲,注册表的一部分包含(除其他外)用户环境变量is存储在文件中ntuser.dat在用户的配置文件目录中。然而,这在 PowerShell 中是无法进行点源的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PowerShell 中获取用户环境变量? 的相关文章

随机推荐

  • 在 Objective C 程序(Xcode)中使用汇编代码

    有没有办法在 Objective C 程序中使用汇编代码 我正在为 OSX 开发一个应用程序 并且希望将汇编代码与 Objective C 代码一起使用 我在网上搜索发现this但我无法成功实施这些方法 任何帮助将不胜感激 是的当然 您可以
  • 电子邮件分区内容

    我正在尝试通过电子邮件发送 Div 的内容 我们有一个在线预订系统 用户选择他们想要的选项 然后提交表格 它会在下一页上显示他们的信息供他们打印 我还想要一份通过电子邮件发送给他们和我们的副本 我喜欢 Jonathon Sampson 使用
  • 为什么我的筛子在查找素数方面表现不佳?

    我编写了两个素数查找函数 但筛子的性能仅提高了 10 左右 我对简单版本使用了两种优化 不要检查偶数 仅检查平方根或j j lt i 相等的 以及对筛子版本的一项优化 仅检查平方根或i i lt n 相等的 我可以向筛子添加哪些优化 我的筛
  • 在 python 3 中从 SVD 重建矩阵

    你好 基本上我的问题是我有一个矩阵 我已经对其进行了 SVD 分解 并将其放入变量 u s 和 v 中 我对 s 矩阵进行了一些更改 使其成为对角线 并更改了一些号码 现在我基本上试图将它从 3 个矩阵重建为一个规则矩阵 然后返回到原始矩阵
  • 在 NetworkX 中显示节点位于精确 (x,y) 位置的图表。结果已旋转

    我在 networkX 上显示我的图表时遇到了麻烦 我从输入中给出的图片中提取一些角点 并将角点保存为 NetworkX 中图形的节点 该节点包含检索角点时的 x y 位置 然后我显示将节点放置在其确切 x y 位置的图表 但是 当我使用显
  • 如何在周视图和日视图中调整 jQuery Full Calendar 中事件的宽度和位置

    我在用全日历在我的 Rails 项目之一中 在日历上呈现事件 The jsfiddle显示场景 我可以调整宽度 但它不会修改同一行中彼此相邻的事件的位置 是否有回调或方法可以在修改宽度时调整事件的位置 看看这个小提琴 http jsfidd
  • 根据一列中的字符串值对 rhandsontable 中的整行进行着色

    我有一个 rhandsontable 如果最后一列 注释 文本中的单元格包含字符串 missed 我希望整个行为黄色 下面的代码突出显示任何具有 missed 值的单元格 但不是整行 此外 当最后一列中的单元格包含 丢失 时 我希望该行变成
  • 使用定界语法访问字符串内的静态变量的正确方法?

    假设我的类中有一个名为 static Var 的静态变量 我试图像这样访问它 该变量有一个成员aString其字符串值为 my static variable echo lt lt
  • 找到屏幕键盘的类名?

    我正在尝试使用这个代码示例从 C NET 3 5 Winforms 应用程序控制 Windows XP 屏幕键盘 OSK exe DllImport User32 dll public static extern Int32 SetFore
  • 升级 1.9 > 1.11 后 Django CSRF 失败

    我刚刚将正在开发的应用程序从 1 9 升级到 1 11 并且在所有表单帖子上不断出现错误 CSRF token missing or incorrect 所有 CSRF 代币在 1 9 中都运行良好 这是视图 def contact req
  • 关键点描述符匹配:如何计算每个模板的拟合优度?

    我不确定这是否属于 stackoverflow 或另一个 stackexchange 站点 非常欢迎在这里输入 我使用 python OpenCV 将目标图像的 BRISK 关键点描述符与三个不同的模板进行匹配 什么是一种实用的 稳健的 统
  • 定义 sympy 函数导数的数值计算

    如何在 sympy 中定义函数导数的数值计算 我有一些函数可以用函数的样条曲线来描述 并且它是使用 scipy interpolate 的导数 我想用这个函数操作一些表达式 然后用样条曲线计算表达式 我可以使用lambdaify 使 sym
  • 从后面的代码更新 ComboBox SelectedItem

    我有一个带有绑定到我的 viewModel 属性的 ComboBox 的视图 一切正常 但我实际上想重用我的视图并且需要 用给定值更新控件 设置属性不会更新视觉 UI 即使事件被解雇 一切看起来都很好 一切正常接受 ComboBox 视觉
  • playframework - 包 javax.persistence 不存在

    我在使用数据库时遇到问题 我本来打算看这个教程http vimeo com 58969923 来自 playframework com 页面的一张 在模型中 play 2 2 1 jcirs app models MedicalIncide
  • C fread 未获取整个文件

    我正在尝试读取二进制文件并将内容存储到字符数组中 此功能对于文本文件非常有效 但对于非文本文件 例如 PNG 文件 它无法按预期工作 下面是代码和结果 怎么了 Code include
  • -[UITableView _endCellAnimationsWithContext: 中的断言失败:

    我充其量只是一个业余爱好者 并且陷入了这个错误 肯定是一些简单的事情 void addTapped id sender TechToolboxDoc newDoc TechToolboxDoc alloc initWithTitle New
  • 传单层 Z 索引

    我需要在传单层之间设置 z index 控制前景中的内容 这是可能的 例如使用bringToFront bringToBack 函数控制2 个 或更多 geoJson 层之间或2 个 或更多 ImageOverlay 层之间 L geoJs
  • 为什么 JSP/JSTL 除以 1000 有时会得到余数?

    当除以 1000 时 我有时会遇到一个不能 正确 除法的 bug 例如 当将 90 55 除以 1000 时 我得到的不是 0 09055 而是 0 090549999999
  • PhoneGap:可以仅使用phonegap.js,并且它的功能仅在网站中(不想要一个应用程序,只需要一个网页)?

    看来我还没有正确理解 PhoneGap 的工作原理 我想 采取一个索引 html 包括PhoneGap js in 作为 JavaScript 类型并在 iPad iPhone 上打开结果 但是 没有一个函数像加速度计 beep vibra
  • 如何在 PowerShell 中获取用户环境变量?

    I see here 可以在 Windows PowerShell 中点源脚本 如何获取用户的环境变量 或者保存用户变量的文件路径 示例 ps1 Environment SetEnvironmentVariable PATH C newap