我发现设置PATH环境变量只影响旧的命令提示符。PowerShell似乎有不同的环境设置。如何更改PowerShell(v1)的环境变量?
注意:
我想使我的更改永久生效,这样我就不必每次运行PowerShell时都设置它。PowerShell是否有配置文件?就像Unix上的Bash配置文件一样?
我发现设置PATH环境变量只影响旧的命令提示符。PowerShell似乎有不同的环境设置。如何更改PowerShell(v1)的环境变量?
注意:
我想使我的更改永久生效,这样我就不必每次运行PowerShell时都设置它。PowerShell是否有配置文件?就像Unix上的Bash配置文件一样?
如果在 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
$env:Path = "C:\MyPath;$env:Path"
。 - Michael Freidgeim改变实际环境变量可以通过使用env: namespace / drive
信息来完成。例如,此代码将更新路径环境变量:
$env:PATH = "SomeRandomPath"; (replaces existing path)
$env:PATH += ";SomeRandomPath" (appends to existing path)
有方法可以使环境设置永久化,但如果您只是从 PowerShell 使用它们,最好使用 Powershell profiles 脚本。
每次启动新的 PowerShell 实例时,它都会查找特定的脚本文件(命名为profile文件),如果存在则执行它们。您可以编辑其中一个 profile 来自定义您的环境。
要知道计算机中这些profile脚本的位置,请键入:
$profile
$profile.AllUsersAllHosts
$profile.AllUsersCurrentHost
$profile.CurrentUserAllHosts
$profile.CurrentUserCurrentHost
你可以编辑其中的一个,例如输入:
notepad $profile
C:\path\to\file.ext
添加到环境变量中,我应该在文件中放什么内容?编辑:我已经找到了。答案是要创建它。文件应该只包含一行:$env:path += ;C:\path\to\file.ext"
。 - Lewistrick$env:Path = "SomeRandomPath";
相反,看下面@mloskot的建议。 - John Mark您还可以使用以下方法永久修改用户/系统环境变量(即在 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")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine)
在启动新的 PowerShell 会话之前,您将看不到此更改的结果。也就是说,如果您在运行此命令后立即检查 $env:Path,则会看到该命令之前的 $env:Path 。为了更新,请关闭并打开 shell 或启动新会话。 - FLGMwt[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
。 - SaitoGIT_INSTALL_ROOT=c:\tools\git
和PATH=...;%GIT_INSTALL_ROOT%\cmd;%GIT_INSTALL_ROOT%\mingw64\bin
,那么你的路径中所有对GIT_INSTALL_ROOT
变量的引用都将消失,因此它将被硬编码为某个固定的目录。 - maoizm警告:在PowerShell提示符下执行$env:path >> a.out
将您现有的路径保存副本,以防出现任何问题。
从PowerShell提示符下执行:
setx PATH "$env:path;\the\directory\to\add" -m
然后您应该会看到文本:
SUCCESS: Specified value was saved.
重新启动您的会话,这样变量就会可用了。 setx
也可以用来设置任意变量。在提示符处键入 setx /?
以获取文档。
$env:PATH
,然后再使用setx /m PATH "$env:PATH"
,这样就可以在不重启 shell 的情况下本地和全局应用路径了? - tresf[Environment]::SetEnvironmentVariable(x,y,"Machine")
和尝试以下三个命令来练习在PowerShell中设置和删除环境变量。[Environment]::SetEnvironmentVariable("newEnvVar", "NewEnvVal", "Machine")
Machine
是一个适用于当前和未来用户的EnvironmentVariableTarget
,与 User
目标相对。
[Environment]::SetEnvironmentVariable("oldEnvVar", "modifiedEnvVal", "Machine")
[Environment]::SetEnvironmentVariable("oldEnvVar", "", "Machine")
Setx
和 $Env
的答案让我头疼。这个回答很简洁优雅! - MD TAREQ HASSAN$ENV:ALICLOUD_ACCESSKEY_ID
和[Environment]::GetEnvironmentVariable('ALICLOUD_ACCESSKEY_ID')
--都将返回空结果。这是某种错误吗? - Jing He像JeanT的回答一样,我需要一个环绕路径添加的抽象。与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 ';'
}
}
请查看我的代码片段,其中包含相应的Remove-EnvPath
函数。
function Set-Env ([string]$Name, [string]$Value, [string]$Target = 'User') { Set-Item "Env:$Name" $Value [System.Environment]::SetEnvironmentVariable($Name, $Value, $Target) }
这使得使用PowerShell更加方便。 - FalcoSetEnvironmentVariable
将 REG_EXPAND_SZ
值 %SystemRoot%\system32
转换为 REG_SZ
值 C:\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
}
我在一篇博客文章中更详细地解释了这个问题。
虽然当前被接受的答案在 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
更多信息请参阅博客文章使用PowerShell修改您的环境路径
如果您使用PowerShell社区扩展,将路径添加到环境变量路径的正确命令是:
Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine
我的建议是这个:
我已经测试过,将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(“;”)
这会为当前会话设置路径,并提示用户将其永久添加:
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
。
"
)。 - Nilzor$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
- d3r3kksetx.exe
和[Environment]::SetEnvironmentVariable()
的解决方案,因为它们总是将REG_EXPAND_SZ
定义替换为REG_SZ
条目,这意味着动态引用其他环境变量的条目会被转换为静态条目。此外,setx.exe
具有 1024 个字符的硬长度限制。 - mklement0Add-Path
。 - dank8