How do I add to the Windows PATH variable using setx? Having weird problems
I want to modify the Windows PATH variable using setx
. The following works at least 50% of the time on Windows 8:
setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\
If it gives the error "the default argument can only be used 2 times", then the following works some of the time:
setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"
The difference is that we wrapped the second argument in quotes. I believe the quotes are necessary when %PATH%
expands to include spaces.
However, I have encountered some weird problems on Windows 7. On one particular Windows 7 machine, I had this problem:
echo %PATH%
It prints:
C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\
Then I do this:
setx PATH "%PATH%;C:\Quux\"
Then it says "Error: Truncated at 1,024 characters." Now let's check what PATH contains:
echo %PATH%
It prints:
C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B
...and it is cut off at 1,024 characters. It ran over because of the duplicates. Also interesting: The value of PATH changes despite the fact that setx
raised an error and did not say "Success".
I was able to repeat this strange behavior several times (luckily I had saved the original contents of PATH).
At the moment, the only surefire way I know to append to the PATH is the following:
-
echo
the PATH. -
Copy the contents of PATH into a text file and manually add
;C:\Python27\;C:\Python27\Scripts\
to the end of the PATH. -
Copy the whole thing out of the text file.
-
setx PATH "<paste the string here>"
That process works every single time on both Windows 7 and Windows 8.
I should really be able to do this in one command. What am I doing wrong?
Solution 1:
Run cmd
as administrator, then:
setx /M PATH "%PATH%;<your-new-path>"
The /M option sets the variable at SYSTEM scope. The default behaviour is to set it for the USER.
TL;DR
The truncation happens because when you echo %PATH%
you get the concatenation of SYSTEM and USER values so, when you add it in your second argument to setx
, the command will try to fit the contents of both SYSTEM and USER within the USER var. When you echo again, the result will be doubled.
The /M
option requires administrator privilege, so you need to open your terminal with "run as administrator" otherwise setx
will fail with "access to registry path is denied".
Note: You won't see the new value when you echo %PATH%
just after setting it this way, you need to close cmd
and open again.
If you want to check the actual values stored in registry check this question.
Solution 2:
This works perfectly:
for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%B
setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"
The 1st command gets the USER environment variable 'PATH', into 'my_user_path' variable The 2nd line prepends the 'C:\Python27;C:\Python27\Scripts;' to the USER environment variable 'PATH'
Solution 3:
If someone want to run it in PowerShell it works like below,
Run Powershell as Administrator
Then
setx /M PATH "$Env:PATH;<path to add>"
To verify, open another Powershell and view PATH as below,
$Env:PATH
Solution 4:
If you're not beholden to setx
, you can use an alternate command line tool like pathed. There's a more comprehensive list of alternative PATH editors at https://superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712
You can also edit the registry value directly, which is what setx
does. More in this answer.
It's weird that your %PATH%
is getting truncated at 1024 characters. I thought setx
didn't have that problem. Though you should probably clean up the invalid path entries.
Solution 5:
Without admin rights the only way that worked for me is a bat file that contains the following code:
for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"
The code is the combination of the answers https://stackoverflow.com/a/45566845/4717152 and https://stackoverflow.com/a/10292113/4717152