Search Results

Windows shell extension to easily add any folder to the PATH

How many times has this happened to you? You’ve downloaded a new Windows command-line tool and want to be able to use it from wherever your current directory happens to be, but the only way to add a folder to Windows’ system PATH is via an unwieldy and hard-to-find modal dialog in the System Properties’ [...]

How many times has this happened to you? You’ve downloaded a new Windows command-line tool and want to be able to use it from wherever your current directory happens to be, but the only way to add a folder to Windows’ system PATH is via an unwieldy and hard-to-find modal dialog in the System Properties’ Advanced tab. Well, I had just this problem last week when I was configuring some new machines and wanted to add some of my favorite command-line tools (mostly ports of Linux/Unix tools like which and less). I was about to go through System Properties to add their directory but figured there had to be a better way.

After a few minutes of Googling, I found this post by “/\/\o\/\/” which demonstrated a way of using Windows PowerShell (the next generation advanced command-line environment for Windows) to add a shell extension, used by right-clicking on any Explorer folder, which adds the selected folder to the system PATH.

Unfortunately, the code shown in the post didn’t quite work as-is and besides I’m not too comfortable yet in PowerShell. So I decided to fix the code and build a script that does the same thing but from CMD (or by double-clicking). It’s very simple to use; just execute the script from a CMD session or double-click it in Explorer. To uninstall, just run it again; it automatically backs out its changes when run a second time.

License and acknowledgement: The original (though non-working) code sample is by “/\/\o\/\/” and linked above; I claim no credit for it. However, I made it work and packaged it into a user-friendly script and so claim copyright over that portion under the GPL.

With that out of the way, here’s the code:


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: AddToPath.cmd ::
:: Written by Andrew Rich (andrew.rich@project-insomnia.com) ::
:: Copyright (c) Andrew Rich under GPL (http://gnu.org/licenses/gpl.html) ::
:: Based on code by "/\/\o\/\/" at http://bit.ly/58hYYh ::
:: ::
:: This command script adds an Explorer shell extension which, when ::
:: selected on right-clicking a folder, will add it to the system PATH. The ::
:: change takes effect immediately for new CMD or PowerShell instances ::
:: started after adding the folder to the PATH. CMD or PowerShell instances ::
:: started adding the folder will continue to use the PATH in effect at the ::
:: time they were started. ::
:: ::
:: Usage: ::
:: Double-click AddToPath.cmd or execute AddToPath.cmd from a CMD session. ::
:: The only command-line parameter available is /? which shows this text. ::
:: ::
:: Requirements: ::
:: - Windows XP SP3 or later. Not tested on Vista or Windows 7 BUT should ::
:: work unaltered. Please send feedback if you run AddToPath on Vista or ::
:: Windows 7. ::
:: - The user executing the command script must be a local Administrator. ::
:: However, the PATH update will affect all users. ::
:: - reg.exe must be on the system PATH. This should be the case for any ::
:: properly functioning Windows machine. ::
:: - Microsoft PowerShell must be properly installed. This should be the ::
:: case for any Windows machine which is current on Windows updates. The ::
:: command script will verify that PowerShell is installed. If the script ::
:: reports that PowerShell is not installed, download and install it from ::
:: http://bit.ly/mYzg4. ::
:: ::
:: Uninstall/remove: ::
:: Just run AddToPath.cmd again. If the "Add To Path" shell extension ::
:: installed by AddToPath.cmd exists, running the command script a second ::
:: time will cause the shell extension to be removed. ::
:: ::
:: Manual uninstall: ::
:: From a CMD session, type: ::
:: ::
:: reg delete HKCR\Folder\Shell\Add_To_Path ::
:: ::
:: Note that uninstalling only removes the Explorer shell extension, and ::
:: does not affect any system PATH entries which may have been added. ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::ENDHEADERCOMMENT

@Echo Off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

:: setup
SET ShellExtKey=HKCR\Folder\Shell\Add_To_Path
SET ShellExtKeyText="Add to Path"
SET PSPathKey=HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

:: check command params
IF [%1]==[] GOTO CmdParamsDone
IF /I %1 EQU --help GOTO ShowHelp
IF /I %1 EQU /? GOTO ShowHelp
IF /I %1 EQU -? GOTO ShowHelp
GOTO ErrBadParam

:ShowHelp
ECHO.
FOR /F "delims=" %%A IN (%~fs0) DO (
IF /I %%A EQU ::ENDHEADERCOMMENT GOTO :EOF
ECHO %%A
)
PAUSE
GOTO :EOF

:ErrBadParam
ECHO.
ECHO "%1" is not a recognized command-line parameter for %0.
ECHO Type %0 /? for help.
ECHO.
PAUSE
GOTO :EOF

:CmdParamsDone
:: check overall prerequisite: reg.exe must be on the system PATH
reg 2>>NUL 1>>&2
IF NOT [%ERRORLEVEL%]==[0] GOTO ErrNoRegExe

:: is the Add_To_Path shell extension already installed?
:: if the reg query fails (errorlevel=1) then it's not installed
reg query %ShellExtKey% 2>>NUL 1>>&2
IF [%ERRORLEVEL%]==[1] GOTO Install
GOTO UnInstall

:Install
:: check install prerequisite: PowerShell must be installed
:: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell should contain the full path to powershell.exe
:: e.g. C:\WINNT\system32\WindowsPowerShell\v1.0\powershell.exe
FOR /F "usebackq tokens=3" %%a IN (`reg query %PSPathKey% /v Path ^| FIND "powershell.exe"`) DO SET PSPATH=%%a
IF NOT DEFINED PSPATH GOTO :ErrNoPowerShell
IF [%PSPATH%] EQU [] GOTO :ErrNoPowerShell

:: build the shell extension's command line
:: does powershell.exe's full path include spaces? if so, add quotes
FOR /F "tokens=2" %%a IN ("%PSPATH%") DO SET s=%%a
IF DEFINED s (
SET AddToPathCmd="%PSPATH%"
) ELSE (
SET AddToPathCmd=%PSPATH%
)
SET AddToPathCmd=%AddToPathCmd% -NonInteractive -NoProfile -Command [system.environment]::setEnvironmentVariable('path',$env:path + ';%%1','machine')

:: create the shell extension's base key under Folder\Shell />reg add %ShellExtKey% /ve /d %ShellExtKeyText% /f 2>>NUL 1>>&2
IF NOT [%ERRORLEVEL%] EQU [0] GOTO ErrRegAdd1

:: add the command line
reg add %ShellExtKey%\Command /ve /d "%AddToPathCmd%" /f 2>>NUL 1>>&2
IF NOT [%ERRORLEVEL%] EQU [0] GOTO ErrRegAdd2

ECHO Installed. Right-click on a folder in Explorer to add it to the system PATH.
PAUSE
GOTO :EOF

:UnInstall
reg delete %ShellExtKey% /f 2>>NUL 1>>&2
IF NOT [%ERRORLEVEL%] EQU [0] GOTO ErrRegDel
ECHO UnInstalled.
PAUSE
GOTO :EOF

:ErrNoRegExe
ECHO Error: reg.exe was not found on the system PATH.
PAUSE
GOTO :EOF

:ErrNoPowerShell
ECHO Error: Windows PowerShell is not installed (or is not installed correctly).
ECHO Go to http://bit.ly/mYzg4 to download and install Windows PowerShell.
PAUSE
GOTO :EOF

:ErrRegAdd1
ECHO Error creating the shell extension's base key.
ECHO Run %0 again to back out any changes.
PAUSE
GOTO :EOF

:ErrRegAdd2
ECHO Error adding the shell extension's command line.
ECHO Run %0 again to back out any changes.
PAUSE
GOTO :EOF

:ErrRegDel
ECHO Error removing the shell extension's registry entry.
ECHO To remove manually, type the following at the CMD prompt:
ECHO reg delete HKCR\Folder\Shell\Add_To_Path
PAUSE
GOTO :EOF

You can copy, paste and save that as AddToPath.cmd, or just download it (I recommend downloading it because line wrapping doesn’t show properly here). AddToPath.cmd.zip

I hope this is useful. Please send me feedback if you use it!

Leave a Comment

I’m a Mac. Are you surprised?

I grew up with PCs. My first PC was an actual, original IBM PC model 5150 (which still lives, dormant for decades now, in my garage). Along the way, I worked on Commodores (VIC-20 and C-64), an Osborne, a Sinclair ZX-80, and there must have been an Apple ][ in there somewhere. But the PC [...]

I grew up with PCs. My first PC was an actual, original IBM PC model 5150 (which still lives, dormant for decades now, in my garage). Along the way, I worked on Commodores (VIC-20 and C-64), an Osborne, a Sinclair ZX-80, and there must have been an Apple ][ in there somewhere. But the PC standard won out and by the late 80s that was all I used. I went through a series of ever-more-powerful PCs, mostly home-built but some mass-market branded, for a number of years. I got to the point where I knew Windows, up through XP, like the back of the proverbial hand.

Meanwhile, Apple was evolving the Mac OS and finally released OS X, a true Unix-class OS with no legacy baggage. I watched from afar but as the OS and machines got better and better, I thought that I might be interested in making a switch–especially when Apple moved to Intel processors and it became possible to easily run Windows on Macs. Finally, I decided that when my then-current PC (a Dell Inspiron laptop) died, I'd buy a Mac notebook to replace it. Perversely, the Dell hung on for a year or two past its expected lifetime, but finally gave up the ghost when I (accidentally, I swear!) spilled most of a bowl of soup into it while working at home one day.

So I bought a MacBook Pro. I acclimated myself to OS X very quickly and was able to keep my Windows applications and workflows mostly intact with VMWare, running Windows side-by-side on OS X. But then a strange thing happened: I found I really didn't need Windows on my Mac after all. I tried keeping VMWare turned off for a week, then for a month, and then I just didn't turn it back on again and finally uninstalled it. There isn't anything that I could do on my Dell on Windows XP Pro that I can't do on my Mac, but (in my experience, as always) OS X beats Windows in the usability and stability department by a mile. And it's trite and over-used, but the Mac does indeed "just work". Things I want to do are right where I subconsciously expect them to be and work the way I instinctively want them to. There's tons of power under the hood, since OS X is a true Unix, but I don't need to deal with it unless I have to, or want to.

So yes, after years and years of being a PC, I'm a Mac.

Leave a Comment

Forgive me, supreme release engineer deity, for I have sinned.

I have coded multithreaded recursive Windows command scripts which call other multithreaded recursive Windows command scripts which then call Ant scripts. I have caused Window scripts to execute code on Linux servers. Further, I have exhibited pride about these actions. What shall my penance be, O supreme release engineer deity?

I have coded multithreaded recursive Windows command scripts which call other multithreaded recursive Windows command scripts which then call Ant scripts. I have caused Window scripts to execute code on Linux servers. Further, I have exhibited pride about these actions. What shall my penance be, O supreme release engineer deity?

Leave a Comment

A day without my phone is like a day in 1990.

My phone (HTC Mogul) is not just a phone, it's my mobile information/connection hub. Which sounds all hackneyed and Web-2-point-oh but it's true. Without the phone I have no addresses, no phone numbers, no text messaging or Twittering, no Google, no maps, no weather… it's awful. I complain a lot about the miserable experience of [...]

My phone (HTC Mogul) is not just a phone, it's my mobile information/connection hub. Which sounds all hackneyed and Web-2-point-oh but it's true. Without the phone I have no addresses, no phone numbers, no text messaging or Twittering, no Google, no maps, no weather… it's awful. I complain a lot about the miserable experience of Windows Mobile but the truth is it's the best available option for me right now. I'd love an iPhone–if Apple would release one that works on the Sprint network (CDMA/PCS) with a slide-out hard keyboard. I'd love a Nokia N97–same caveat. Neither are likely in the near future.

In conclusion, a day without my phone sucks.

Leave a Comment

I started using the Internet in around 1994

My first Internet connection was via 2400bps modem to Netcom, on a beige-box 386 probably running Windows 3.11. This would have been in the early to mid 90s, probably 1994. I had an @ix.netcom.com address, used NetCruiser on the nascent Web and poked around in newsgroups.

My first Internet connection was via 2400bps modem to Netcom, on a beige-box 386 probably running Windows 3.11. This would have been in the early to mid 90s, probably 1994. I had an @ix.netcom.com address, used NetCruiser on the nascent Web and poked around in newsgroups.

Leave a Comment

Easy AdSense by Unreal

Project Insomnia is Digg proof thanks to caching by WP Super Cache