I wrote a set of batch scripts for this. addpath.bat adds elements to the path, rmpath.bat removes elements from the path, and lpath.bat just lists the path. But then I needed some support scripts, so there is also chkpath.bat .
It ended up being not trivial and required tr.exe and cat.exe, a couple of unix-style utilities. The reason its not trivial: no backticks in cmd.exe (though you can use for loops for this), and short names versus long names.
addpath.bat:
@echo off
setlocal
set cwd=%~dps0
goto testit
:loopy
call %cwd%chkpath "%~1"
if %errorlevel%==2 (
set path=%path%;%~1
)
shift
:testit
if not _%1==_ goto loopy
call %cwd%lpath.bat
endlocal & set path=%path%
ChkPath.bat:
@echo off
goto START
-------------------------------------------------------
chkpath.bat
checks path for existence of the given segment.
Returns 1 if present, 2 if not present, 0 if not checked.
The matching and checking complicated by case sensitivity and "short pathnames".
created sometime in 2003
-------------------------------------------------------
:START
setlocal
set rc=0
set cwd=%~dps0
set curdrive=%~d0
if _%1==_ goto Usage
if not _%TEMP%==_ goto GotTemp
set temp=c:\
:GotTemp
call %cwd%\setz %cwd%stamp.bat
set tempfile1=%TEMP%\chkpath1-%setz%.tmp
set tempfile2=%TEMP%\chkpath2-%setz%.tmp
echo %path% | %curdrive%\utils\tr.exe ; \n > %tempfile1%
@REM convert to fully-qualified, short path names
set tocheck=%~fs1
@REM convert to uppercase:
call :ToUpper %tocheck%
set tocheck=%setz%
@REM check each element in the path for the match:
for /f "delims=^" %%I in (%tempfile1%) do call:CheckElt "%%I"
if %rc%==0 set rc=2
goto END
--------------------------------------------
@REM subroutine
:CheckElt
@REM @echo off
if %rc%==1 goto CheckEltDone
@REM remove surrounding quotes
set ERF=%1
@REM if empty, then skip it
if [x%ERF%]==[x] goto CheckEltDone
@REM convert to fully-qualified, short paths, uppercase
set ERF=%~fs1%
call:ToUpper %ERF%
set ERF=%setz%
@if [%tocheck%]==[%erf%] set rc=1
:CheckEltDone
goto:EOF
@REM end subroutine
--------------------------------------------
--------------------------------------------
@REM subroutine
:ToUpper
@echo %1 | %curdrive%\utils\tr.exe a-z A-Z > %tempfile2%
call %cwd%setz %curdrive%\utils\cat.exe %tempfile2%
goto:EOF
@REM end subroutine
--------------------------------------------
--------------------------------------------
@REM subroutine
:CleanUp
if _%tempfile1%==_ goto CleanUpDone
if exist %tempfile1% del %tempfile1%
if _%tempfile2%==_ goto CleanUpDone
if exist %tempfile2% del %tempfile2%
:CleanUpDone
goto:EOF
--------------------------------------------
--------------------------------------------
:Usage
echo.
echo Usage: chkpath ^<path^>
echo checks if path element is included in path variable.
echo returns 1 if yes, 2 if no, 0 if not checked.
echo.
goto END
--------------------------------------------
:END
call:CleanUp
:ReallyEnd
endlocal & set errorlevel=%rc%
@REM set errorlevel=%rc%
@REM echo %errorlevel%
lpath.bat:
@echo.
@set curdrive=%~d0
@REM This form post-fixes a | at the end of each path element. Useful for debugging trailing spaces.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e s/PATH=// -e 's/;/^|\n/g' -e 's/$/^|/g'
@REM This form shows bare path elements.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e 's/PATH=//' -e 's/;/^\n/g'
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.