如何在批处理脚本中刷新PATH环境变量

6
我有一个批处理文件 "file.bat",它将使用以下命令调用安装程序:
msiexec.exe /i "%~dp0\installer.msi"

安装程序将会安装一个程序并更新路径变量。 虽然这样做很好,但问题在于当我尝试启动程序时,它找不到,因为明显路径变量没有更新。 我尝试从批处理文件中重新启动自己来解决问题:
start cmd /c file.bat 

但是它没有起作用。有没有一种方法可以刷新PATH变量,或者重新启动批处理文件以在新进程中检测新环境?

PS:手动重新启动批处理文件当然可以,但这不是我想要的。

谢谢。


set path=%path%;C:\Some other folder - Squashman
1
如果您发布整个文件.bat,我认为这可能会很有用。 - Compo
3
安装程序刚刚修改了系统的 PATH 值,你需要直接从注册表中使用命令 reg 或命令 setx 读取该值,并将本地的 PATH 更新或替换为新的系统 PATH。例如,参考 Why are other folder paths also added to system PATH with SetX and not only the specified folder path? 中的答案,了解如何直接从注册表获取系统 PATH - Mofi
谢谢你的建议。最终我使用了这里的解决方案:https://dev59.com/-XVC5IYBdhLWcg3w1Exq 它需要一个额外的文件来工作。真奇怪,这个问题不能更容易地解决! - luffy
4个回答

12

最简单的方法是使用Chocolatey(免费软件)。然后,您只需执行一个简单的命令即可重新加载带有变量扩展的PATH:

使用Chocolatey(免费软件)是最简单的方法。然后,您可以使用一个简单的命令重新加载包含变量扩展的PATH:

refreshenv

使用命令提示符进行安装(需要管理员权限):

@"%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

3
在 Windows PowerShell 中,执行完毕后请退出并重新运行。

1

这是一个简单的批处理文件,可以刷新%path%环境变量:

@echo off
echo.
echo Refreshing PATH from registry

:: Get System PATH
for /f "tokens=3*" %%A in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do set syspath=%%A%%B

:: Get User Path
for /f "tokens=3*" %%A in ('reg query "HKCU\Environment" /v Path') do set userpath=%%A%%B

:: Set Refreshed Path
set PATH=%userpath%;%syspath%

echo Refreshed PATH
echo %PATH%

这是一个很好的答案J03L,但问题在于当我设置路径如下时:JAVA_7 = C:\Program Files\Java\jdk1.7xxxx JAVA_8 = C:\Program Files\Java\jdk1.8xxxx JAVA_HOME = %JAVA_8% Path = %JAVA_HOME%\bin;%MAVEN_HOME%\bin 因为这将生成一个带有 %JAVA_8%\bin;C:\windows\System32\WindowsPowerShell\v1.0;C:\windows\idmu\common;等的PATH。你认为是否可能更改批处理文件以在用户变量上生成第二级变量替换? 只是好奇,不过还是一个不错的答案! - jfajunior
由于某些原因,路径中并非所有的空格都被保留(即原始路径显示为“Program Files (x86)”,但设置的变量显示为“ProgramFiles (x86)”)。 - script'n'code
我认为这部分 set userpath=%%A%%B 应该改为 set userpath=%%A %%B(注意多了一个空格)。 - undefined

0
要在Windows批处理脚本中重置路径,您可以从PowerShell输出系统环境变量,并将输出分配给路径,如下所示:
for /f "tokens=* usebackq" %%p in (`powershell -Command "& {[System.Environment]::GetEnvironmentVariable('Path','Machine') + ';' + [System.Environment]::GetEnvironmentVariable('Path','User')}"`) do (set path=%%p)

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