Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am trying to set environment variables using the setx command, such as follows

setx PATH "f:\common tools\git\bin;f:\common tools\python\app;f:\common tools\python\app\scripts;f:\common tools\ruby\bin;f:\masm32\bin;F:\Borland\BCC55\Bin;%PATH%"

However, I get the following error if the value is more then 1024 characters long:

WARNING: The data being saved is truncated to 1024 characters.

SUCCESS: Specified value was saved.

But some of the paths in the end are not saved in variable, I guess due to character limit as the error suggests.

share|improve this question
There's a list of alternative ways to edit the %PATH% at – Ehtesh Choudhury Oct 10 '13 at 5:15
up vote 32 down vote accepted

Your best bet is to edit the registry directly.

Navigate to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment and edit the Path value (then reboot to activate the new value).

Note however that while you can enter a very long path, (up to the maximum environment variable length; 2,048 or 32,768 bytes depending on the source), not all software will be able to read and handle it correctly if it is too long.

share|improve this answer
Is reboot really required here ? How does setx do it ? Setx does not require reboot. – Madhur Ahuja Feb 9 '12 at 14:10
Yes, a reboot is required. setx edits the registry as I indicated, then broadcasts a WM_SETTINGCHANGE message. This tells all top-level windows that a system setting has changed (in this case an environment variable). Without that, Explorer and programs you opened with it will not know about the change. You could broadcast the message yourself manually (I wrote a program to do just that, and a batch file to replace SETX that makes a registry edit followed by the broadcast), but just like setx and the System Properties envvar dialog, it has side-effects that make rebooting preferable. – Synetech Feb 9 '12 at 19:05
Oh and editing an env.var. actually causes problems if you don’t reboot because any environment variables that contain other variables will stop being expanded. For example, I just broadcast it and now this is my path and I get an error because the path is now “broken”/empty. None of the vars will expand properly again until I reboot. Unfortunately this is “normal”. :-| – Synetech Feb 10 '12 at 3:40
I found a small PowerShell script that will broadcast the WM_SETTINGCHANGE message. – Justin Dearing Apr 7 '12 at 23:13
You can use the above registry method via the REG add command and then use SETX to set some other variable to itself (ie: SETX /M USERNAME %USERNAME%). This will cause the WM_SETTINGCHANGE message to be set and give your the ability to set the path from a batch file. – Art Sep 14 '12 at 2:26

if you are using windows vista or higher, you can make a symbolic link to the folder. for example:

mklink /d C:\pf "C:\Program Files"

would make a link so c:\pf would be your program files folder. I shaved off 300 characters from my path by using this trick.

(I know it's not related to setx but it is useful for people which are searching overcomming on 1024 char limit)

share|improve this answer

You could use a PowerShell script similar to the following:

$newPath = 'f:\common tools\git\bin;f:\common tools\python\app;f:\common tools\python\app\scripts;f:\common tools\ruby\bin;f:\masm32\bin;F:\Borland\BCC55\Bin'
$oldPath = [Environment]::GetEnvironmentVariable('path', 'machine');
[Environment]::SetEnvironmentVariable('path2', "$($newPath);$($oldPath)",'Machine');

The Environment.SetEnvironmentVariable() API call will broadcast WM_SETTINGCHANGE so you do not need to reboot.

share|improve this answer
Don't you also need the following line: [Environment]::SetEnvironmentVariable('path', "$newPath",'Machine'); – Fedor Steeman Aug 28 '13 at 13:21
In the 3rd line, I'm not sure what benefit the extra dollar signs and parentheses bring. Couldn't you just say [Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine') ? – twasbrillig Jan 15 '15 at 19:21
@twasbrillig I'm just careful when I'm including a variable in a string. in this case its unecessary. – Justin Dearing Jan 15 '15 at 20:46

This open-source SetEnv command-line tool is good to edit the PATH and other environment variables without limitations. It uses a dynamic buffer so no static limitations like 1024.

The choice of a % as a prefix to append to a variable could have been better though, as makes the syntax difficult sometimes if used with other batch local variables...

share|improve this answer
> SetEnv tool is good to edit the PATH and other environment variables without limitations Indeed. In fact, I had personally worked with Darka on that page to help make SetEnv even better so that it can fully support expanding/sub-variables (the Dynamic Variable Expansion section), which actually helps to reduce the length of the raw path. – Synetech Jun 28 '12 at 5:39

A far superior tool than setx for path manipulation is pathed.exe. Unfortunately, it's limited to editing the path.

In addition to a superior user experience than setx, you don't have a 1024 character limit. Unlike direct registry manipulation, this application uses the Environment.SetEnvironmentVariable() API call which will broadcast WM_SETTINGCHANGE.

share|improve this answer
There's a list of other tools (including pathed.exe) at‌​-7 – Ehtesh Choudhury Oct 10 '13 at 5:14

If you put in in BAT file you can do something like that:

setx path "%%path%%;c:\drive\fr;c:\drive\installs\7z"

See the double "%".


share|improve this answer

if it is not required to keep system PATH and user PATH separate:

::setx /m truncate variable length to 1024 REG ADD 
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_SZ /f /d "%PATH%"
::empty local path, use system wide only, else it will enlarge with every setx /m
setx PATH ""
::setx is dummy but propagate system wide variables with it
setx /m A A
share|improve this answer
Can you explain a bit more about what you are suggesting here? – G-Man Oct 24 '14 at 14:18
It is just a ready to use command to workaround setx 1024 character limit. Example is shown directly on PATH variable. Although the previous answers are helpful they lack a final solution. – fantastory Oct 24 '14 at 16:16

My favorite way is to change the folder names in the PATH variables to use the 8.3 names. This StackOverflow answer has an awesome script (run from a .bat file) that will generate the "minified" version of the entire PATH variable, which you can then paste into the Edit Variable dialog(s). Only caveat is that you will need to split out the SYSTEM and USER parts. As the script goes through and figures out the minified version for each folder, it discards and alerts you of any invalid/non-existent paths. Nice little clean up bonus.

share|improve this answer
Be careful if you have used fsutil.exe behavior set disable8dot3 1. – Andrew Morton Jan 6 at 19:04
@AndrewMorton good point but wouldn't that be "handled" by the fact that the script doesn't "generate" the 8.3 name, it just reports the 8.3 name that the file system assigned? So if a folder did not have an 8.3 name, the script would not propose a substitute. However, using fsutil 8dot3name strip AFTER using the script would definitely cause problems for affected folders. – Andrew Steitz Jan 13 at 18:55
Unfortunately I don't have a spare drive or system to check it on. However, having used some fsutil 8dot3name strip earlier today and considering that (a) it checks the registry first and (b) the path is stored in the registry, my earlier concern may be unwarranted, as long as the user does not use the /f (force) option. – Andrew Morton Jan 13 at 19:05

I think the best way is the next (with powershell) With this way also you avoid the litmit of 1024 character.

You can see the code on:

#------------ Add path to system variable -------------------------------------

$path2add = ';C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

If (!$systemPath.contains($path2add)) {
    $systemPath += $path2add
    $systemPath = $systemPath -join ';'
    [Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');
    write-host "Added to path!"
    write-host $systemPath

#------------ Delete path from system variable --------------------------------

$path2delete = 'C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

$systemPath = $systemPath.replace($path2delete, '')
$systemPath = $systemPath -join ';'

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

write-host "Deleted from path!"
write-host $systemPath

#------------ Clean system variable -------------------------------------------

$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');

while ($systemPath.contains(';;')) {
    $systemPath = $systemPath.replace(';;', ';')

[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');

write-host "Cleaned path!"
write-host $systemPath
share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .