Windows – Add a directory and all subdirectories to the PATH variable with a single entry

command lineenvironment-variableswindowswindows 8

I've got a directory in my home folder in which I place command-line software (CMD_Software). I put each piece of software in its own directory within CMD_Software in order to avoid clutter.

I would like to make a single entry in my PATH variable that will allow access to CMD_Software and all directories it contains from the command line.

I tried C:\Users\myuser\CMD_Software\* but that did nothing. That's the point at which I ran out of ideas.

Please note that I'm not trying to set a new path while in the terminal, I'm trying to set a new path in the "Environment Variables" available on the "Advanced" tab of System Properties.

Best Answer

The PATH variable does not support wildcards or recursion. This is by design.

There are two possible workarounds that I've used on occasion:

  • Create a directory with simple batch files and add that directory to the PATH. Each batch file can launch the program you want, for example:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    The first line is a comment, the second starts with @ to avoid showing the command being run, and %* is used to pass any command line arguments to the EXE.

  • Add aliases to CMD.EXE:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    This essentially translates CMD_Software in the command prompt to everything after the equal sign. The $* is replaced with the supplied arguments.

I prefer the second approach, because you can group all the aliases in a single file (see the "/MACROFILE" switch in DOSKEY /?) and have it autorun whenever the command interpreter starts using a registry setting (see "AutoRun" key in CMD /?).

A drawback of the second method is that aliases work only at the start of a command line. This can be a problem if you want to chain commands. For example, CLS & CMD_Software won't work unless you put the alias in a separate line using parentheses:

CLS & (
CMD_Software
)

Whenever this becomes a problem, I just fallback to the batch file approach.

Related Question