【发布时间】:2013-07-21 14:19:54
【问题描述】:
如果我有一个 PowerShell ISE 实例正在运行,并且我安装了一些修改 PATH 的东西,或者我在 PowerShell 之外以任何方式对其进行了修改,那么我需要重新启动 PowerShell 才能看到更新后的 PATH 变量。
有没有办法在不重新启动的情况下从 PowerShell 中重新加载路径?
【问题讨论】:
标签: powershell console powershell-ise
如果我有一个 PowerShell ISE 实例正在运行,并且我安装了一些修改 PATH 的东西,或者我在 PowerShell 之外以任何方式对其进行了修改,那么我需要重新启动 PowerShell 才能看到更新后的 PATH 变量。
有没有办法在不重新启动的情况下从 PowerShell 中重新加载路径?
【问题讨论】:
标签: powershell console powershell-ise
尝试获取机器路径并将其分配给会话的路径。
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
【讨论】:
"User" 中而不是在"Machine" 环境变量中。
只是为了让Rob's comment曝光:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
【讨论】:
refreshenv。这基本上运行了more elaborate version rob 的评论。
refreshenv 将不起作用。 refreshenv 仅适用于随后打开的 shell。
如果您的路径包含在会话开始时未定义的环境变量,您也需要扩展它们:
$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
对我来说,这在安装 NVM 后很有用,它定义了 %NVM_HOME% 并将其添加到路径中。
要得出其合乎逻辑的结论,您可以使用此递归函数来展开:
function Expand-EnvironmentVariablesRecursively($unexpanded) {
$previous = ''
$expanded = $unexpanded
while($previous -ne $expanded) {
$previous = $expanded
$expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
}
return $expanded
}
然后使用:
$env:Path = Expand-EnvironmentVariablesRecursively([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
我已经 opened an issue 将此解决方案添加到 Chocolatey 的 refreshenv。
【讨论】:
基于mpen's answer,这里是一个PowerShell函数:
function refresh-path {
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
";" +
[System.Environment]::GetEnvironmentVariable("Path","User")
}
那就打电话给refresh-path吧。
【讨论】:
最简单的方法是使用 Chocolatey(免费软件)。它适用于 CMD 和 PowerShell。然后你就可以用一个简单的命令重新加载 PATH(带变量扩展):
refreshenv
从 cmd 安装(需要管理员权限):
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
示例用法:
> SET JAVA_HOME=c:/java/jdk6
> SET PATH=%JAVA_HOME%/bin
> ECHO %PATH%
c:/java/jdk6/bin
> SET JAVA_HOME=c:/java/jdk8
> refreshenv
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
> echo %PATH%
c:/java/jdk8/bin
【讨论】:
refreshenv 对我不起作用(Windows 10)。我仍然需要打开一个新窗口才能使其生效。
refreshenv 也不在这里工作。在 Windows 沙盒环境中处理一些脚本,除非启动新的 PS 会话,否则路径会拒绝更新。
只是为了添加到其他答案,您可以通过过滤来确保不会添加多余的连接,以防用户路径为空。
$env:Path=(
[System.Environment]::GetEnvironmentVariable("Path","Machine"),
[System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'
或者,更有用的是,如果您正在运行添加到不同或多个环境变量的脚本,请使用函数将它们全部重置
function resetEnv {
Set-Item `
-Path (('Env:', $args[0]) -join '') `
-Value ((
[System.Environment]::GetEnvironmentVariable($args[0], "Machine"),
[System.Environment]::GetEnvironmentVariable($args[0], "User")
) -match '.' -join ';')
}
resetEnv Path
resetEnv AppPath
【讨论】: