gpt4 book ai didi

powershell - Windows $ env:path =“$($env:path);.”它在哪里添加的?

转载 作者:行者123 更新时间:2023-12-03 01:28:27 27 4
gpt4 key购买 nike

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

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

最佳答案

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

$env:EnvVarName = 'foo'

等效于调用.NET方法 System.Environment.SetEnvironmentVariable ,如下所示:
[Environment]::SetEnvironmentVariable('EnvVarName', 'foo', 'Process')

也就是说,更新的范围是当前过程。

只有在上述调用中用'User'代替'Machine''Process'(仅Windows才支持[1]),才需要在注册表中持久更新环境变量(分别针对当前用户或本地计算机(所有用户)), 用于将来的 session (过程)[2]。

从PowerShell [Core] 7.0开始,尚无PowerShell本机持久更新环境变量的方法,但引入的方法是 being discussed on GitHub

换句话说: 如果您不仅要更新基于注册表的定义,而且要更新当前过程中的值,则需要同时调用;例如,对于当前用户:
# 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 检索特定于范围的值;例如。:
# Get the registry-based *user* value 
[Environment]::GetEnvironmentVariable('Path', 'User')

Windows上 Path环境变量( $env:PATH)的重要注意事项:
  • Path环境变量的特殊之处在于它是一个复合值:进程启动时,进程内值是Machine(本地计算机,对于所有用户)值和User(当前用户)值的串联。
  • 因此,如果您要修改(附加)现有的Path,最好不要简单地通过附加到现有的进程内值($env:Path)来定义新值,因为您将复制MachineUser值,取决于您定位的范围。
  • 而是从目标范围中有选择地检索现有值,修改该值(通常通过附加目录,然后将修改后的值写回到同一范围中。)
    鉴于可能已经修改了$env:Path的进程内副本,因此要在当前进程中有效地使同一修改有效也很重要。但是,在将新目录追加到用户路径的简单情况下,只需执行$env:Path += ';' + $newDir即可;在其他情况下,您也可能会采用这种简单的方法,但是请注意,由于$env:Path中目录的列出顺序很重要,因此行为可能有所不同。

  • 例:
    # 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平台上,分隔符为 :,而不是 ;(在 [System.IO.Path]::PathSeparator中反射(reflect),并且区分大小写的变量名称为 Path。如上所述,.NET在Unix-上根本不提供持久的环境变量定义。之类的平台(从.NET Core 3.1开始),因为各种平台都没有统一的本机机制。

    [1]在类Unix平台上,从.NET Core 3.1开始,针对 UserMachine的目标被悄悄地忽略了。

    [2] 警告:当前PowerShell session 直接创建的新进程(直接调用, Start-ProcessStart-Job)尚未看到注册表更改,因为继承了当前 session 的环境。

    关于powershell - Windows $ env:path =“$($env:path);.”它在哪里添加的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60324206/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com