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

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.


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.


This is what I use to fix the problem. Copy this script below and save it as FIXPATH.BAT into the folder that you've added to the PATH environment variable. For instance:

C:\Users\myuser\CMD_Software\

Now whenever you need to run a program that's in a subfolder, say...

C:\Users\myuser\CMD_Software\unixutils\grep.exe
or
C:\Users\myuser\CMD_Software\imagetools\exiftool.exe

Run fixpath first then enter the command (e.g. grep or exiftool) like so:

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users\myuser>fixpath
C:\Users\myuser>exiftool


FIXPATH.BAT
setlocal EnableDelayedExpansion
cd /D %~dp0

for /R %%d in (.) do (
    set "dirs=!dirs!;%%d"
)

path=%path%!dirs!
(endlocal
    set "ret=%PATH%"
)
cmd /K "title [#] Path Fixed [#] && path %ret%"
exit /B

Thanks to @VonC's answer


Put a "programlinks\" subdirectory under ...\CMD_Software (or anywhere, actually) and fill it up with symbolic links or hardlinks to each executable you wish to access. Then a single entry in the PATH for ...\programlinks will suffice.