6

I have a batch file "file.bat" that will call an installer with the following command:

msiexec.exe /i "%~dp0\installer.msi"

The installer will install a program and update the Path variable. While this works fine, the problem is when I try to start the program it's not found because apparently the PATH variable was not updated. I tried restarting the batch file from within itself with:

start cmd /c file.bat 

but it didn't work. Is there a way to refresh the PATH variable or maybe restart the batch file in a new process so that it detects the new environment?

PS: restarting the batch file manually works of course but it's not what I want.

Thanks.

luffy
  • 1,766
  • 1
  • 16
  • 22
  • `set path=%path%;C:\Some other folder` – Squashman Oct 04 '16 at 15:52
  • 1
    I think it may be useful if you posted the entire file.bat. – Compo Oct 04 '16 at 15:57
  • 3
    You have to read the __system__ `PATH` value just modified by the installer directly from registry either with command __reg__ or with command __setx__ and update/replace __local__ `PATH` with new __system__ `PATH`. See for example answer on [Why are other folder paths also added to system PATH with SetX and not only the specified folder path?](http://stackoverflow.com/a/25919222/3074564) how to get __system__ `PATH` directly from registry. – Mofi Oct 04 '16 at 17:29
  • Thank you for the suggestions. I ended up using the solution from here: http://stackoverflow.com/questions/171588/is-there-a-command-to-refresh-environment-variables-from-the-command-prompt-in-w It needs an extra file to work. It's weird that this can't be solved more easily! – luffy Oct 05 '16 at 11:07

3 Answers3

8

Easiest way, use Chocolatey (freeare). Then you will be able to reload PATH (with variable expansion) with a simple command:

refreshenv

Installation from cmd (requires admin rights):

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

Example usage:

> 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
1

simple batch file that refreshes the %path% environment variable:

@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
  • 294
  • 3
  • 16
  • It is a good answer J03L, but the problem is when I set path like this: 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 Because this will generate a PATH with %JAVA_8%\bin;C:\windows\System32\WindowsPowerShell\v1.0\;C:\windows\idmu\common;etc. Do you think it's possible to change the batch file to generate a second level variable substituion on user variables? Just curious, still a nice answer tho! – jfajunior Sep 01 '17 at 10:02
  • For some reason, not all spaces in a path are preserved (i.e. the original path shows 'Program Files (x86)', but the set variable shows 'ProgramFiles (x86)' ). – script'n'code Aug 27 '19 at 04:26
1

IN Windows PowerShell exit and run again