Windows $env:path ="$($env:path);。"它是在哪里添加的?

2023-12-09

我通过运行“解决”了一个问题$env:path ="$($env:path);."来自 PowerShell。显然它将当前目录添加到我的路径中。请问它添加到哪个路径变量?在我的环境变量对话框中,我会在哪里看到它被添加?用户变量?系统变量?

我很困惑,因为我已经将该文件夹添加到系统变量中path,但在运行“$env:path ="$($env:path);”之前无法运行包含的脚本。


更新至$env:EnvVarName影响仅当前进程- 不会通过注册表进行持久性更改:

$env:EnvVarName = 'foo'

相当于调用.NET方法System.Environment.SetEnvironmentVariable如下:

[Environment]::SetEnvironmentVariable('EnvVarName', 'foo', 'Process')

也就是说,更新的范围是当前进程.

Only if you substitute 'User' or 'Machine' for 'Process' in the above call (supported on Windows only[1]) do you persistently update environment variables in the registry (for the current user or the local machine (all users), respectively), for future sessions (processes)[2].

As of PowerShell [Core] 7.2, there is no PowerShell-native way to persistently update environment variables, but introducing one is being discussed on GitHub.

换句话说:如果您不仅想更新基于注册表的定义,还想更新当前进程中的值,则需要both calls;例如,对于当前用户:

# Windows only: Update / create a persistent definition for the current user,
#               stored in the registry.
[Environment]::SetEnvironmentVariable('EnvVarName', 'foo', 'User')

# Update value for current process too.
$env:EnvVarName = 'foo'

或者,更多的是本着DRY:

'User', 'Process' | foreach {
  [Environment]::SetEnvironmentVariable('EnvVarName', 'foo', $_)
}

如果新值基于给定注册表范围中的现有值,请通过以下方式检索特定于范围的值:System.Environment.GetEnvironmentVariable; e.g.:

# Get the registry-based *user* value 
[Environment]::GetEnvironmentVariable('Path', 'User')

警告:不支持基于 Windows 的环境变量REG_EXPAND_SZ注册表值:

在 Windows 上,持久定义的环境变量可以基于other环境变量,即定义该变量的基础注册表值是否属于类型REG_EXPAND_SZ.

从 .NET 6 开始,System.Environmenttype 的方法做not(直接)支持这样的环境变量:

  • On getting这样一个变量的值,它的expanded表单总是被返回;也就是说,对其他环境变量的引用,例如%SystemRoot%被它们的值所取代。

  • On setting环境变量,REG_SZ注册表值为总是创建的,即静态的、逐字的值 - 即使在更新现有的REG_EXPAND_SZ value.

悄悄转变的同时REG_EXPAND_SZ环境变量改为静态REG_SZ那些通常可能没有不良影响(只要新值仅包含文字值),它当然can:例如,假设一个变量是根据以下形式定义的%JAVADIR%;如果该变量根据当时的当前值转换为静态值%JAVADIR%,如果值为%JAVADIR%是后来改变的。

很遗憾,检索原始数据REG_EXPAND_SZ目前需要环境变量及其值的正确更新直接注册表访问,这相当麻烦(甚至 Windows API 似乎也不支持它) - 请参阅这个答案.


重要考虑因素Path环境变量($env:PATH) 在 Windows 上:

  • The Path环境变量的特殊之处在于它是合成的value:当一个进程启动时,进程内的值是级联 of the Machine(本地计算机,对于所有用户)值和User(当前用户)值。

    • 请注意,由于机器级值排在第一位,因此其条目优先于用户级值的条目。
  • 因此,如果您想修改(追加)现有的Path,这样更好not只需附加到现有的进程内值即可定义新值($env:Path),因为你会复制 the Machine or User值,具体取决于您的目标范围。

    • 相反,有选择地从目标范围中检索现有值,修改该值(通常通过附加目录,然后将修改后的值写回同一范围。

    • 为了使相同的修改在当前进程也是如此是不平凡的,因为进程中的副本$env:Path可能已被修改;但是,在将新目录附加到用户路径的简单情况下,您可以简单地执行以下操作$env:Path += ';' + $newDir;在其他情况下,您也可以使用这种简单的方法,但请注意,行为可能会有所不同,因为order其中目录列出在$env:Path很重要。

重要的: The PathWindows 上的环境变量是REG_EXPAND_SZ默认情况下基于 -,因此需要注意安静地转换为静态REG_SZ以下代码执行的基于值的应用 - 再次参见这个答案寻求适当但更复杂的解决方案。

Example:

# New dir. to add to the *user's* path
$newDir = 'c:\foo\bin'

# Get current value *from the registry*
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')

# Append the new dir and save back to the registry.
[Environment]::SetEnvironmentVariable('Path', ($userPath + ';' + $newDir), 'User')

# To also update the current process, append $newDir to the in-process
# variable, $env:Path
$env:Path += ';' + $newDir

顺便说一句:开类 Unix 平台,分隔符是:, not ;(体现[System.IO.Path]::PathSeparator,以及区分大小写变量名称是Path。如前所述,.NET 基本上不提供执着的类 Unix 平台上的环境变量定义(从 .NET Core 3.1 开始),因为各个平台没有统一的本机机制来执行此操作。


[1] On Unix-like platforms, targeting User or Machine is quietly ignored as of .NET Core 3.1

[2] Caveat: New processes created directly by the current PowerShell session (direct invocation, Start-Process, Start-Job) do not yet see the registry changes, because the inherit the current session's environment.

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

Windows $env:path ="$($env:path);。"它是在哪里添加的? 的相关文章

随机推荐

  • 我可以创建一个带有弧形底部的 div 吗?

    所以我正在开发一个网站 我想知道是否可以纯粹使用 HTML5 CSS3 如果需要的话还可以使用 JavaScript 制作一个底部弯曲的 div 所以它实际上看起来像这样 或者只能使用背景图像来完成 div class navbar nav
  • 如何在用户输入的输入类型=文本中附加%符号?

    我正在使用数字微调器 并且默认情况下我希望输入在文本框中包含 符号 我尝试使用跨度 但它在框外添加了符号 您可以使用一个简单的 css 技巧来实现这一点 只需将其添加到您的代码中即可 spinner input padding right
  • 我可以在 Unix 中运行 jshell 吗?

    我想使用expect重定向jshell输入 以便我可以在录制的演示中模拟输入 但是 尽管我可以从 Expect 脚本生成一个 jshell 进程 该进程也可以识别 jshell 提示符 但之后就没有任何效果了 期望输出看起来像控制序列 例如
  • 如何在 verilog 中不使用 while() 循环(用于综合)?

    我已经养成了开发大量测试平台并使用 for 和 while 循环进行测试的习惯 没关系 问题是我已经将这种习惯用于对应该可综合的电路进行编码 XST等拒绝合成代码 无需对合成参数进行额外修改 例如 while num lt test num
  • ImageButton 高度问题

    下午好 我正在尝试创建带有阴影的 ImageButton 要做到这一点
  • 选择 Pandas 中特定月份的行

    我有一个包含 10 多年来 12 小时数据的数据框 所有数据均按日期存储 我想提取包含特定月份数据的列 请注意 该月份不是标准的 1 2 3 格式 我的 日期 列的行如下所示 01 May 07 02 May 07 31 Oct 17 如何
  • 检索文档数据,其中条件值是子集合值

    我在 firestore 上的数据库如下所示 Candidates ID 1 likeDislikeSuper ID 1 data value n ID 2 likeDislikeSuper ID 2 data valu
  • 邻区信息不准确

    我正在尝试利用有关相邻小区的移动信息 该信息可在 Android 上通过TelephonyManager类及其getNeighboringCellInfo方法 下面我发布了完成这项工作的一部分代码 主要取自公开来源 以及该代码产生的输出的一
  • 具有变异状态的 JavaScript 日志记录对象[重复]

    这个问题在这里已经有答案了 这段 JavaScript 代码 var o console dir o o foo bar console dir o results in the same interactive tree output s
  • 如何在Android中集成Azure媒体播放器

    我有一个必须播放的清单流媒体网址 如何在android中集成azure媒体播放器来播放流视频 我找到了另一种解决方法来播放清单网址 只需连接即可 format m3u8 aapl v3 在网址末尾 您可以使用任何视频播放器播放此网址
  • 类型转换和初始化,在 Swift 中哪个更好?

    由于Swift对类型做了严格的检查 有时我们需要在NSString和String NSArray和 AnyObject 等之间进行转换 但实际上有两种不同的方法可以做到这一点 类型转换 例如str as String 初始化 比如Strin
  • 在 Angular 中取消提交表单

    我需要一个表格才能两者兼而有之 dirty并不是 submitted为了我的验证工作 我正在尝试通过 CSS 使用 ng invalid ng dirty and ng submitted由 Angular 动态添加的类 这意味着我不能简单
  • 为什么 pynput 不检测数字键盘按下?

    我在 Windows 7 上使用 python 3 7 有没有办法检测 pynput 模块中的数字 例如 1 按键 我尝试了很多其他模块 但除了 tkinter 之外我什么也没得到 它需要一个窗户 但我不想要那个 from pynput i
  • 将日期插入数据库 Postgres JDBC

    我是 Java 新手 也是 Postgres 新手 我有一个关于餐厅的小项目 我有一个像这样的 struk eng bill 表 我有一种方法可以将信息插入到该表中 如下所示 public int insertBill int id kar
  • Set-Content 在我的文件末尾附加一个换行符(换行符、CRLF)

    我的原始配置文件 web1 config 没有多余的行 在记事本中查看 显示所有字符 时看起来如下
  • xcodebuild 期间 RestKit/RestKit.h' 文件未找到错误

    我正在尝试使用 Jenkins CI 自动构建一个使用 Restkit 的 iOS 项目 显然 restkit 作为主项目中的一个项目驻留在其中 并且该项目使用 XCode IDE 成功构建 但是当我使用 xcodebuild jenkin
  • Docker 构建:无法获取档案

    我在 Windows 机器上使用 docker 工具箱 我正在尝试从 github 构建这个项目https github com pyannote pyannote video 当我通过运行构建图像时docker build t pyann
  • jQuery/Ajax 请求被发送两次

    我一遍又一遍地扫描我的代码 但似乎找不到问题 当我点击链接时 add user btn文件actions php被调用两次 因此 PHP 脚本被执行两次 这是脚本 我想它与ajax请求前面的javascript有关 function add
  • 抓住模式下方的六条线

    我有这些重复的台词 FINAL RESULTS NSTEP ENERGY RMS GMAX NAME NUMBER 1000 4 7910E 01 2 1328E 01 9 4193E 01 C 62 最终结果表示一组值的平均值 输出文件合
  • Windows $env:path ="$($env:path);。"它是在哪里添加的?

    我通过运行 解决 了一个问题 env path env path 来自 PowerShell 显然它将当前目录添加到我的路径中 请问它添加到哪个路径变量 在我的环境变量对话框中 我会在哪里看到它被添加 用户变量 系统变量 我很困惑 因为我已