ChatGPT解决这个技术问题 Extra ChatGPT

设置 Windows PowerShell 环境变量

我发现设置 PATH 环境变量只影响旧的命令提示符。 PowerShell 似乎有不同的环境设置。如何更改 PowerShell (v1) 的环境变量?

笔记:

我想让我的更改永久化,所以我不必在每次运行 PowerShell 时都设置它。 PowerShell 有配置文件吗?类似于 Unix 上的 Bash 配置文件?

我想要一个位于文件共享上的中央配置文件。同步是一种痛苦。使用 . 创建存根配置文件。 \\computer\share\path\Profile.ps1 看起来像是一个杂物(试试记事本 $Profile)。如果有办法永久更改 $Profile 自动变量,那就太好了。
不,PATH 环境确实 也会影响 powershell 命令提示符。但不同的是,powershell 不接受用引号括起来的路径。解决方案:删除路径环境变量中的所有封闭引号("
如果你在这里登陆 PS > v1 ... 继上面 Nilzor 的评论之后:使用它从会话的 PATH 环境变量中的路径中删除所有 ":$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str

T
Todd Sewell

如果在 PowerShell 会话期间的某个时间,您需要查看或临时修改 PATH 环境变量,您可以键入以下命令之一:

$env:Path                             # shows the actual content
$env:Path = 'C:\foo;' + $env:Path     # attach to the beginning
$env:Path += ';C:\foo'                # attach to the end


+1 :: 这种单线对于基于会话的调用非常有效,就像 mingw ... IE $env:PATH += ";c:\MinGW\msys\1.0\bin" ^ {some mingw bin ... }
以及如何删除路径?
如果您需要在标准路径之前调用路径,请将其插入到开头 $env:Path = "C:\MyPath;$env:Path"
****不要忘记附加字符串开头的分号,如@Kevin 的评论中所示。这很明显,但是如果您只是在答案中复制/粘贴代码并且在现有路径的末尾没有分号,则可能会错过。我会尝试提交编辑。
@MattGoodrich 我已经回滚到以前的版本
F
Flavio Vilante

可以使用 env: namespace / drive 信息更改实际环境变量。例如,此代码将更新路径环境变量:

$env:Path = "SomeRandomPath";             (replaces existing path) 
$env:Path += ";SomeRandomPath"            (appends to existing path)

使改变永久化

有一些方法可以使环境设置永久化,但如果您只在 PowerShell 中使用它们,那么使用 Powershell profiles 脚本可能要好得多。

每次启动一个新的 Powershell 实例时,它都会查找特定的脚本文件(命名配置文件)并在它们存在时执行它们。您可以编辑其中一个配置文件来自定义您的环境。

要了解这些配置文件脚本在您的计算机类型中的位置:

$profile                                     
$profile.AllUsersAllHosts           
$profile.AllUsersCurrentHost        
$profile.CurrentUserAllHosts    
$profile.CurrentUserCurrentHost     

您可以编辑其中之一,例如,通过键入:

notepad $profile

$profile 是一个自动变量,它指向所有 PowerShell 主机的用户配置文件。
请注意,(split-path $profile)(获取包含文件夹)可以包含多个配置文件:profile.ps1 应由所有主机加载,_profile.ps1 仅由指定主机加载。对于 PowerShell.exe(控制台主机),这是 Microsoft.PowerShell_profile.ps1。
如果我的文档中没有 WindowsPowerShell 文件夹怎么办?我应该创建文件夹和文件吗?如果我想将 C:\path\to\file.ext 添加到环境变量中,我应该在文件中添加什么?编辑:已经找到了。答案是肯定的,创造它。该文件应包含 1 行:$env:path += ;C:\path\to\file.ext"
@Lewistrick 默认情况下您没有个人资料。我按照以下说明创建了一个:howtogeek.com/50236/customizing-your-powershell-profile
这样做要小心——它会破坏你现有的路径。 $env:Path = "SomeRandomPath"; 相反 - 请参阅下面的 @mloskot。
G
Giulio Caccin

您还可以使用以下内容永久修改用户/系统环境变量(即在 shell 重新启动时将保持不变):

修改系统环境变量

[Environment]::SetEnvironmentVariable
     ("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)

修改用户环境变量

[Environment]::SetEnvironmentVariable
     ("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)

注释中的用法 - 添加到系统环境变量

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
    [EnvironmentVariableTarget]::Machine)

如果您不想编写类型,也可以使用基于字符串的解决方案

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")

这对于受限访问系统非常有用。
@AndresRiofrio,是的,这是永久性的。用法:[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) 在启动新的 powershell 会话之前,您不会看到此更改的结果。 也就是说,如果您在运行此命令后立即检查 $env:Path,您将看到 $ env:Path 在命令之前。要更新,请关闭并打开 shell 或启动新会话。
@FLGMwt 你有一个错字,正确的是: [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTarget]::Machine)
您可以编写字符串“Machine”或“User”而不是整个 .NET 枚举。从 Technet
我认为该答案还应该演示设置用户变量的用法,例如 [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
t
tjb

警告:通过在 PowerShell 提示符下执行 $env:path >> a.out 保存现有路径的副本,以防出现问题。

从 PowerShell 提示符:

setx PATH "$env:path;\the\directory\to\add" -m

然后你应该看到文本:

SUCCESS: Specified value was saved.

重新启动会话,变量将可用。 setx 也可用于设置任意变量。在文档提示处键入 setx /?


似乎仅在“以管理员身份运行”时有效,此后仅对“以管理员身份运行”PowerShell 控制台生效,而不是定期运行的控制台。
哎哟 - 刚刚被 setx 的 1024 个字符限制所击中;谢天谢地,我按照建议记录了 $end:Path 的现有值。只是需要注意的一点:superuser.com/questions/387619/…
为什么不先设置 $env:PATH,然后设置 setx /m PATH "$env:PATH",以便它在本地和全局应用而无需重新启动 shell?
好的!尽管 setx 不是本机 cmdlet,但对于那些令人讨厌的冗长 .NET Framework 调用来说,它仍然是一个更好且容易被遗忘的替代方案!令人费解的是,即使 Powershell 7 仍然没有提供官方 cmdlet 来保留 envvars。什么。感觉就像一个应该与“ls”相提并论的功能。
C
Community

JeanT's answer 一样,我想要一个关于添加路径的抽象。与 JeanT 的回答不同,我需要它在没有用户交互的情况下运行。我正在寻找的其他行为:

更新 $env:Path 以便更改在当前会话中生效

为将来的会话保留环境变量更改

当相同路径已存在时不添加重复路径

如果它有用,这里是:

function Add-EnvPath {
    param(
        [Parameter(Mandatory=$true)]
        [string] $Path,

        [ValidateSet('Machine', 'User', 'Session')]
        [string] $Container = 'Session'
    )

    if ($Container -ne 'Session') {
        $containerMapping = @{
            Machine = [EnvironmentVariableTarget]::Machine
            User = [EnvironmentVariableTarget]::User
        }
        $containerType = $containerMapping[$Container]

        $persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
        if ($persistedPaths -notcontains $Path) {
            $persistedPaths = $persistedPaths + $Path | where { $_ }
            [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
        }
    }

    $envPaths = $env:Path -split ';'
    if ($envPaths -notcontains $Path) {
        $envPaths = $envPaths + $Path | where { $_ }
        $env:Path = $envPaths -join ';'
    }
}

查看 my gist 以获得相应的 Remove-EnvPath 函数。


我在我的个人资料中添加了以下小功能:function Set-Env ([string]$Name, [string]$Value, [string]$Target = 'User') { Set-Item "Env:$Name" $Value [System.Environment]::SetEnvironmentVariable($Name, $Value, $Target) } 使用 PowerShell 让生活变得如此轻松
T
TechDogLover OR kiaNasirzadeh

注意1:在提升的powershell上运行这些命令(例如具有管理员权限)

注意 2:在使您的命令正常工作的每一步之后,关闭会话并再次打开它

不要让自己头疼,想要一个简单的单行解决方案:

添加永久环境变量:

[Environment]::SetEnvironmentVariable("NewEnvVar", "NewEnvValue", "Machine")

修改/更改:

[Environment]::SetEnvironmentVariable("oldEnvVar", "NewEnvValue", "Machine")

删除/删除:

[Environment]::SetEnvironmentVariable("oldEnvVar", "", "Machine")

确实所有那些 Setx & $Env 个答案让我头疼。这一款很优雅!
我还在 Windows 终端内的 Windows 10 21H2 和 PowerShell 5.1 中发现了这个问题——我们需要关闭会话并重新打开它以检查结果。或者两个命令 - $ENV:ALICLOUD_ACCESSKEY_ID[Environment]::GetEnvironmentVariable('ALICLOUD_ACCESSKEY_ID') - 只会返回空结果。这是某种错误吗?
@JingHe 实际上我不确定我们可以称它为错误!,这只是他们设计它的方式,我也不太满意!
P
Peter Mortensen

尽管当前接受的答案在路径变量从 PowerShell 的上下文中永久更新的意义上起作用,但它实际上并没有更新存储在 Windows 注册表中的环境变量。

为此,您显然也可以使用 PowerShell:

$oldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path

$newPath=$oldPath+’;C:\NewFolderToAddToTheList\’

Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH –Value $newPath

更多信息在博文中Use PowerShell to Modify Your Environmental Path

如果您使用 PowerShell 社区扩展,则将路径添加到环境变量路径的正确命令是:

Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine

P
Peter Mortensen

所有暗示永久更改的答案都有相同的问题:它们破坏了路径注册表值。

SetEnvironmentVariableREG_EXPAND_SZ%SystemRoot%\system32 转换为 REG_SZC:\Windows\system32

路径中的任何其他变量也会丢失。使用 %myNewPath% 添加新的将不再起作用。

这是我用来解决此问题的脚本 Set-PathVariable.ps1

 [CmdletBinding(SupportsShouldProcess=$true)]
 param(
     [parameter(Mandatory=$true)]
     [string]$NewLocation)

 Begin
 {

 #requires –runasadministrator

     $regPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
     $hklm = [Microsoft.Win32.Registry]::LocalMachine

     Function GetOldPath()
     {
         $regKey = $hklm.OpenSubKey($regPath, $FALSE)
         $envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
         return $envPath
     }
 }

 Process
 {
     # Win32API error codes
     $ERROR_SUCCESS = 0
     $ERROR_DUP_NAME = 34
     $ERROR_INVALID_DATA = 13

     $NewLocation = $NewLocation.Trim();

     If ($NewLocation -eq "" -or $NewLocation -eq $null)
     {
         Exit $ERROR_INVALID_DATA
     }

     [string]$oldPath = GetOldPath
     Write-Verbose "Old Path: $oldPath"

     # Check whether the new location is already in the path
     $parts = $oldPath.split(";")
     If ($parts -contains $NewLocation)
     {
         Write-Warning "The new location is already in the path"
         Exit $ERROR_DUP_NAME
     }

     # Build the new path, make sure we don't have double semicolons
     $newPath = $oldPath + ";" + $NewLocation
     $newPath = $newPath -replace ";;",""

     if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){

         # Add to the current session
         $env:path += ";$NewLocation"

         # Save into registry
         $regKey = $hklm.OpenSubKey($regPath, $True)
         $regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)
         Write-Output "The operation completed successfully."
     }

     Exit $ERROR_SUCCESS
 }

我在 a blog post 中更详细地解释了这个问题。


这应该是:$newPath = $newPath -replace ";;",";" ?
P
Peter Mortensen

这会设置当前会话的路径并提示用户永久添加它:

function Set-Path {
    param([string]$x)
    $Env:Path+= ";" +  $x
    Write-Output $Env:Path
    $write = Read-Host 'Set PATH permanently ? (yes|no)'
    if ($write -eq "yes")
    {
        [Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::User)
        Write-Output 'PATH updated'
    }
}

您可以将此功能添加到您的默认配置文件 (Microsoft.PowerShell_profile.ps1),通常位于 %USERPROFILE%\Documents\WindowsPowerShell


S
SBF

@Michael Kropat's 答案的基础上,我添加了一个参数以将新路径添加到现有 PATH 变量中,并进行检查以避免添加不存在的路径:

function Add-EnvPath {
    param(
        [Parameter(Mandatory=$true)]
        [string] $Path,

        [ValidateSet('Machine', 'User', 'Session')]
        [string] $Container = 'Session',

        [Parameter(Mandatory=$False)]
        [Switch] $Prepend
    )

    if (Test-Path -path "$Path") {
        if ($Container -ne 'Session') {
            $containerMapping = @{
                Machine = [EnvironmentVariableTarget]::Machine
                User = [EnvironmentVariableTarget]::User
            }
            $containerType = $containerMapping[$Container]

            $persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
            if ($persistedPaths -notcontains $Path) {
                if ($Prepend) {
                    $persistedPaths = ,$Path + $persistedPaths | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
                else {
                    $persistedPaths = $persistedPaths + $Path | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
            }
        }

        $envPaths = $env:Path -split ';'
        if ($envPaths -notcontains $Path) {
            if ($Prepend) {
                $envPaths = ,$Path + $envPaths | where { $_ }
                $env:Path = $envPaths -join ';'
            }
            else {
                $envPaths = $envPaths + $Path | where { $_ }
                $env:Path = $envPaths -join ';'
            }
        }
    }
}

P
Peter Mortensen

我的建议是这个:

我已经对此进行了测试以将 C:\oracle\x64\bin 永久添加到环境变量 Path 中,并且效果很好。

$ENV:PATH

第一种方法很简单:

$ENV:PATH=”$ENV:PATH;c:\path\to\folder”

但这种变化不是永久性的。在您关闭 PowerShell 终端并再次重新打开它后,$env:path 将默认恢复为之前的状态。那是因为您在会话级别而不是在源级别(即注册表级别)应用了更改。要查看 $env:path 的全局值,请执行以下操作:

Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH

或者更具体地说:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

现在要改变这一点,首先我们捕获需要修改的原始路径:

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

现在我们定义新路径应该是什么样子。在这种情况下,我们将附加一个新文件夹:

$newpath = “$oldpath;c:\path\to\folder”

注意:确保 $newpath 与您希望的一样。如果没有,那么您可能会损坏您的操作系统。

现在应用新值:

Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH -Value $newPath

现在做最后一次检查,它看起来像你期望的那样:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).Path

您现在可以重新启动 PowerShell 终端(甚至重新启动机器)并查看它不会再次回滚到其旧值。

请注意,路径的顺序可能会发生变化,因此它是按字母顺序排列的,因此请确保检查整行。为方便起见,您可以使用分号作为分隔符将输出拆分为行:

($env:path).split(“;”)

Y
YorSubs

只有将值推送到注册表的答案才会影响永久更改(因此,此线程上的大多数答案,包括接受的答案,不会永久影响 {1 })。

以下函数适用于 Path / PSModulePathUser / System 类型。默认情况下,它还会将新路径添加到当前会话。

function AddTo-Path {
    param ( 
        [string]$PathToAdd,
        [Parameter(Mandatory=$true)][ValidateSet('System','User')][string]$UserType,
        [Parameter(Mandatory=$true)][ValidateSet('Path','PSModulePath')][string]$PathType
    )

    # AddTo-Path "C:\XXX" "PSModulePath" 'System' 
    if ($UserType -eq "System" ) { $RegPropertyLocation = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' }
    if ($UserType -eq "User"   ) { $RegPropertyLocation = 'HKCU:\Environment' } # also note: Registry::HKEY_LOCAL_MACHINE\ format
    $PathOld = (Get-ItemProperty -Path $RegPropertyLocation -Name $PathType).$PathType
    "`n$UserType $PathType Before:`n$PathOld`n"
    $PathArray = $PathOld -Split ";" -replace "\\+$", ""
    if ($PathArray -notcontains $PathToAdd) {
        "$UserType $PathType Now:"   # ; sleep -Milliseconds 100   # Might need pause to prevent text being after Path output(!)
        $PathNew = "$PathOld;$PathToAdd"
        Set-ItemProperty -Path $RegPropertyLocation -Name $PathType -Value $PathNew
        Get-ItemProperty -Path $RegPropertyLocation -Name $PathType | select -ExpandProperty $PathType
        if ($PathType -eq "Path") { $env:Path += ";$PathToAdd" }                  # Add to Path also for this current session
        if ($PathType -eq "PSModulePath") { $env:PSModulePath += ";$PathToAdd" }  # Add to PSModulePath also for this current session
        "`n$PathToAdd has been added to the $UserType $PathType"
    }
    else {
        "'$PathToAdd' is already in the $UserType $PathType. Nothing to do."
    }
}

# Add "C:\XXX" to User Path (but only if not already present)
AddTo-Path "C:\XXX" "User" "Path"

# Just show the current status by putting an empty path
AddTo-Path "" "User" "Path"

l
lantrix

正如 Jonathan Leaders 提到的 here,运行提升的命令/脚本以便能够更改 'machine' 的环境变量很重要,但运行一些提升的命令并不一定要完成使用社区扩展,所以我想以某种方式修改和扩展 JeanT's answer,即使脚本本身没有运行提升也可以执行更改机器变量:

function Set-Path ([string]$newPath, [bool]$permanent=$false, [bool]$forMachine=$false )
{
    $Env:Path += ";$newPath"

    $scope = if ($forMachine) { 'Machine' } else { 'User' }

    if ($permanent)
    {
        $command = "[Environment]::SetEnvironmentVariable('PATH', $env:Path, $scope)"
        Start-Process -FilePath powershell.exe -ArgumentList "-noprofile -command $Command" -Verb runas
    }

}

P
Peter Mortensen

在 PowerShell 中,可以通过键入以下内容导航到环境变量目录:

Set-Location Env:

这会将您带到 Env:> 目录。在此目录中:

要查看所有环境变量,请键入:

Env:\> Get-ChildItem

要查看特定环境变量,请键入:

Env:\> $Env:<variable name>, e.g. $Env:Path

要设置环境变量,请键入:

Env:\> $Env:<variable name> = "<new-value>", e.g. $Env:Path="C:\Users\"

要删除环境变量,请键入:

Env:\> remove-item Env:<variable name>, e.g. remove-item Env:SECRET_KEY

About Environment Variables 中有更多信息。


P
Peter Mortensen

大多数答案都没有解决UAC。这涵盖了 UAC 问题。

首先通过 http://chocolatey.org/ 安装 PowerShell 社区扩展:choco install pscx(您可能需要重新启动 shell 环境)。

然后启用 pscx

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx

然后使用 Invoke-Elevated

Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR

M
Mac

明确一点,1990年代的Windows方式是点击开始,右键这台电脑,选择属性,然后选择高级系统设置,然后在弹出的对话框中选择环境变量,在列表中双击在 PATH 上,然后使用 New、Edit、Move Up 和 Move Down 仍然可以更改 PATH。 Power shell 和 Windows 的其余部分可以获取您在此处设置的任何内容。

是的,您可以使用这些新方法,但旧方法仍然有效。在基础级别,所有永久更改方法都是编辑注册表文件的受控方式。


P
Peter Mortensen

打开 PowerShell 并运行:

[Environment]::SetEnvironmentVariable("PATH", "$ENV:PATH;<path to exe>", "USER")

P
Peter Mortensen

我尝试稍微优化 SBF'sMichael's 代码以使其更紧凑。

我依赖 PowerShell 的类型强制,它会自动将字符串转换为枚举值,所以我没有定义查找字典。

我还拉出了根据条件将新路径添加到列表的块,这样工作就完成了一次并存储在一个变量中以供重复使用。

然后根据 $PathContainer 参数将其永久应用或仅应用于会话。

我们可以将代码块放在我们直接从命令提示符调用的函数或 ps1 文件中。我选择了 DevEnvAddPath.ps1。

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session',
    [Parameter(Position=2,Mandatory=$false)][Boolean]$PathPrepend=$false
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -notcontains $PathChange) {
    $PathPersisted = $(switch ($PathPrepend) { $true{,$PathChange + $PathPersisted;} default{$PathPersisted + $PathChange;} }) | Where-Object { $_ };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

我为 DevEnvRemovePath.ps1 做了类似的事情。

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session'
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -contains $PathChange) {
    $PathPersisted = $PathPersisted | Where-Object { $_ -ne $PathChange };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

到目前为止,它们似乎有效。


M
MrMesees

很多附加或覆盖的例子。以下是在 Powershell for Linux、Ubuntu 18.04 和 pwsh 7.1.3 上添加路径的示例

$ENV:PATH = "/home/linuxbrew/.linuxbrew/bin:$ENV:PATH"

我专门添加了 linuxbrew (homebrew for linux) bin 目录以优先于已安装的系统。它帮助解决了我遇到的一个问题,虽然这是最有帮助的地方,但它也让我“实验”了。

请注意,: 是 Linux 路径分隔符,而在 Windows(或至少我的 Windows)上,您通常将 ; 用于 powershell。


O
Ogier Schelvis

@ali Darabi's answer 中编辑注册表项对我来说效果最好,但是当我没有从 Powershell 执行此操作的正确权限时。所以我直接在regedit中编辑了。

我想在这个答案中进一步扩展这个主题。

重新启动 Powershell 也不足以传播更改。我必须打开任务管理器并重新启动 explorer.exe 才能触发重新加载注册表。

导航注册表可能非常繁琐,因此为了保持用户友好的体验,您可以从 Powershell 执行此操作:

REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v "LastKey" /d "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment" /f; regedit

它将最后打开的窗口设置为某个注册表路径,以便下次打开 regedit 时它会以正确的键打开。


S
Somnium

如果您需要动态设置变量名称并且仅用于会话,请使用:

New-Item env:\$key -Value $value -Force | Out-Null