我发现设置PATH环境变量只影响旧的命令提示符。PowerShell似乎有不同的环境设置。如何更改PowerShell(v1)的环境变量?
注意:
我想使我的更改永久生效,这样我就不必每次运行PowerShell时都设置它。PowerShell是否有配置文件?就像Unix上的Bash配置文件一样?
我发现设置PATH环境变量只影响旧的命令提示符。PowerShell似乎有不同的环境设置。如何更改PowerShell(v1)的环境变量?
注意:
我想使我的更改永久生效,这样我就不必每次运行PowerShell时都设置它。PowerShell是否有配置文件?就像Unix上的Bash配置文件一样?
有很多关于追加或覆盖的例子。这里是一个在Linux上使用powershell为Ubuntu 18.04添加路径的示例,使用pwsh
7.1.3
$ENV:PATH = "/home/linuxbrew/.linuxbrew/bin:$ENV:PATH"
我特别将linuxbrew(linux上的homebrew)二进制目录添加到优先于系统安装的位置。这有助于解决我遇到的问题,尽管这是最有帮助的地方之一,但也让我“实验”。
请注意,:
是Linux路径分隔符,而在Windows上(或者至少在我的Windows上),您通常会在powershell中使用;
。
对我来说,编辑@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时就会在正确的键处打开。
我依赖于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;
到目前为止,它们似乎运行正常。
"
)。 - Nilzor$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
- d3r3kksetx.exe
和[Environment]::SetEnvironmentVariable()
的解决方案,因为它们总是将REG_EXPAND_SZ
定义替换为REG_SZ
条目,这意味着动态引用其他环境变量的条目会被转换为静态条目。此外,setx.exe
具有 1024 个字符的硬长度限制。 - mklement0Add-Path
。 - dank8