设置Windows PowerShell环境变量

953

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

注意:

我想使我的更改永久生效,这样我就不必每次运行PowerShell时都设置它。PowerShell是否有配置文件?就像Unix上的Bash配置文件一样?


1
我想要一个位于文件共享上的中央配置文件。同步很麻烦。通过使用. \computer\share\path\Profile.ps1创建存根配置文件似乎不是很好的解决办法(尝试Notepad $Profile)。如果有一种可以永久更改$Profile自动变量的方法就好了。 - Nathan Hartley
6
PATH环境变量确实会影响PowerShell命令提示符。不同的是,PowerShell不接受用引号括起来的路径。解决方法是:删除路径环境变量中所有的引号(")。 - Nilzor
4
如果您在使用PS > v1时遇到问题,请参考Nilzor上面的评论:使用以下命令可以删除PATH环境变量中所有路径中的引号,以便于您的会话:$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str - d3r3kk
1
关于与 PowerShell 无关的持久更新,请参见:https://dev59.com/lcLra4cB1Zd3GeqPDCY1。请注意,应该避免使用基于 setx.exe[Environment]::SetEnvironmentVariable() 的解决方案,因为它们总是将 REG_EXPAND_SZ 定义替换为 REG_SZ 条目,这意味着动态引用其他环境变量的条目会被转换为静态条目。此外,setx.exe 具有 1024 个字符的硬长度限制。 - mklement0
如果遵循@mklement0的建议,可以使用PowerShell cmdlet Add-Path - dank8
1
这个回答解决了你的问题吗?使用PowerShell永久添加路径到Windows似乎不起作用 - dank8
24个回答

0

有很多关于追加或覆盖的例子。这里是一个在Linux上使用powershell为Ubuntu 18.04添加路径的示例,使用pwsh 7.1.3

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

我特别将linuxbrew(linux上的homebrew)二进制目录添加到优先于系统安装的位置。这有助于解决我遇到的问题,尽管这是最有帮助的地方之一,但也让我“实验”。

请注意,是Linux路径分隔符,而在Windows上(或者至少在我的Windows上),您通常会在powershell中使用;


0

对我来说,编辑@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时就会在正确的键处打开。


0

我尝试优化SBFMichael的代码,使其更加紧凑。

我依赖于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;

到目前为止,它们似乎运行正常。


-1
在Windows容器中添加环境变量,请按照以下步骤进行操作:
在dockerfile中添加环境变量 ENV MYENVVAR
运行 $env:MYENVVAR
docker run -e MYENVVAR=

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接