How to use setx command in a windows batch file

26,621

Solution 1

The Windows command line error:

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Type "SETX /?" for usage.

Summary:

You are using a setx command and assigning it multiple tokens when only one is allowed.

How to reproduce this error on Windows:

Open a windows cmd terminal and enter these commands. This throws the error:

C:\Users\Charity>setx FANCYPANTS string with spaces

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Type "SETX /?" for usage.

Do the same command, but quote your string like this:

C:\Users\Charity>setx FANCYPANTS "string with spaces quoted"
SUCCESS: Specified value was saved.
C:\Users\Charity>

The variable was set, restart the cmd terminal here to load changes.

C:\Users\Charity>echo %FANCYPANTS%
string with spaces quoted

The environment variable is saved. Now delete it.

C:\Users\Charity>setx FANCYPANTS ""
SUCCESS: Specified value was saved.

restart the cmd terminal here to load changes. Print contents again.

C:\Users\Charity>echo %FANCYPANTS%
%FANCYPANTS%

the variable FANCYPANTS was deleted and no longer exists.

Solution 2

SETX requires values with spaces to be quoted, and quotes within the value must be escaped as \".

Best also to use delayed expansion to protect against special characters during the batch parsing phase.

The following will not only toggle the values for new CMD sessions, it will also toggle the value for the remainder of the batch script run. An implicit ENDLOCAL at the end of the script will revert to the old values within the current session once the script ends. If needed, the script can be modified to preserve the new values past the ENDLOCAL barrier.

@echo on
setlocal enableDelayedExpansion
if "!PYTHONHOME:~-2!" == "24" (
  set "PYTHONHOME=C:\Python33"
  set "PATH=!PATH:Python24=Python33!"
) else (
  set "PYTHONHOME=C:\Python24"
  set "PATH=!PATH:Python33=Python24!"
)
setx PYTHONHOME "!home!"
setx PATH "!path:"=\"!"
pause

Solution 3

The SETX command is very reliant on the syntax of the command. The following example shows the basic syntax to use to set the path environment variable:

SETX PATH "%PATH%;Path to new thing added" /M

This will also add the new path to the system registry, but still won't add it for the current session. Re-launch the terminal for it to take affect.

Share:
26,621
Manmohan Singh
Author by

Manmohan Singh

Solving one problem at a time.

Updated on January 29, 2020

Comments

  • Manmohan Singh
    Manmohan Singh over 4 years

    I am trying to create a windows batch file to automatically set the environment variable to use python 2.4 or python 3.3.

    Both python 2.4 and 3.3 are installed on my system. Here is my code:

    ::To toggle between Python24 and Python 33
    @echo on
    if (%PYTHONHOME:~-2%) == "24" (setx PYTHONHOME "C:\Python33" && setx PATH %PATH:Python24=Python33% ) else (setx PYTHONHOME "C:\Python24" && setx PATH %PATH:Python33=Python24% )
    pause
    

    To start with I have PYTHONHOME set to C:\Python24

    But the above script gives the following error:

    SUCCESS: Specified value was saved.
    ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
    Type "SETX /?" for usage.
    

    My PYTHONHOME still points to python 24 and nothing is changed. The setx command does not change the environment variable. What is causing this error?

  • Andriy M
    Andriy M over 11 years
    The setx commands reference newHome and newPath, which have never been assigned before. Did you mean to use PYTHONHOME and PATH instead?
  • dbenham
    dbenham over 11 years
    @AndriyM - thanks, all fixed. I started out using "new" variables, then switched strategy without fully converting.
  • Jim2B
    Jim2B over 8 years
    How do I preserve variable values after the ENDLOCAL barrier? I've encountered this issue before and had to save the value out to a scratch file and read it back in to get across the barrier in the past.