I've got a new office and I must clean off my inherited whiteboard. The previous owner left various diagrams, code snippets, etc. on for such a time that they can no longer be erased by conventional means: the whiteboard eraser is useless! I couldn't find any whiteboard cleaner either, but Ali told me the following secret. You can write over the dried on text with a normal dry erase marker. When you erase the new markings the old are erased as well. It sounds too fantastic, but believe me, its true! I don't know the brand or material of the whiteboard but the whiteboard markers are 'Expo, Bold Color Dry Erase'.
whichcommand is a rather literal port and requires you to enter the entire name of the command for which you're looking. That is '
which which' won't find itself but '
which which.exe' will. This makes this almost useless for me so I thought to write my own as a batch file. I had learned about a few goodies available in cmd.exe that I thought would make this an easy task. It turned out to be more difficult than I thought.
The environment variables
for /F "usebackq tokens=*" %%a in ( `"echo %PATH:;=& echo %"` ) do ( for /F "usebackq tokens=*" %%b in ( `"echo %PATHEXT:;=& echo %"` ) do ( if exist "%%a"\%1%%b ( for %%c in ( "%%a"\%1%%b ) do ( echo %%~fc ) ) ) )
PATHEXThold the list of paths to search through to find commands, and the extensions of files that should be run as commands respectively. The '
for /F "usebackq tokens=*" %%a in (...) do (...)' runs the '
do' portion with
%%asequentially taking on the value of every line in the '
in' portion. That's nice, but
PATHEXTdon't have their elements on different lines and I don't know of a way to escape a newline character to appear in a batch file. In order to get the
PATHEXT's elements onto different lines I used the
%ENV:a=b%syntax which replaces occurrences of a with b in the value of ENV. I replaced the '
;' delimiter with the text '
& echo' which means
%PATHEXT:;=& echo%evaluates to something like "
echo .COM& echo .EXE& echo .BAT& ...". I have to put the whole expression in double quotes in order to escape the '&' for appearing in the batch file. The
usebackqand the backwards quotes means that the backquoted string should be replaced with the output of the execution of its content. So in that fashion I'm able to get each element of the env. variable onto new lines. The rest is pretty straight forward.
C:\Users\davris>which.cmd *hi* C:\Windows\System32\GRAPHICS.COM C:\Windows\System32\SearchIndexer.exe D:\bin\which.exe D:\bin\which.cmd