Archive for January, 2010

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’ 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!

Comments off

I’m with CoCo

Source

Comments off

I stay warm with a fire in the fireplace

It's been a cold winter here in the Bay Area. Yes, it's been colder on the east coast (even in Florida!) and for some people, low-40s isn't cold at all, but it's been cold FOR ME.

The Fireplace

My preferred method of staying warm during the winter is lighting a fire in the fireplace and curling up under a blanket with one or more cats. I'll turn on the central heat if necessary but prefer not to.

Comments off

A good breakfast better include…

Coffee
Coffee brings me back to life in the morning. It’s not just a preference, it’s a requirement. I usually like it with milk or half-and-half and sugar (real “raw” sugar, please) but if it’s the good stuff I might forgo the milk.

Pancakes
I’ve always liked pancakes though I don’t smother them in butter and syrup like most people. A little butter and, hold your breath, a little salt is all I need. A friend sent us a “breakfast kit” from LL Bean that includes buttermilk pancake mix, coffee (see above), real maple syrup and blueberry jam.

Bagel with lox, cream cheese and veggies
A meal in itself, but the bagel had better be nicely toasted and the smoked salmon had better be very very fresh. Appropriate veggies include red onions, capers, cucumbers and perhaps a little mesclun salad.

Comments off

Alex on the Disney Magic will do your ‘do right

I have long hair. Really long hair. I don't get it cut often (or as some would say, often enough) but the second-to-last time was on our 2008 cruise on the Disney Magic. The lead hairdresser in the onboard Vista Spa, Alex, took care of me personally and did a terrific job.

I don't recommend booking a Disney Cruise just to get your hair done, but if you are on the Magic and it's due (or overdue) then you can't go wrong with Alex.

Comments off