rem Tricks you can play in TakeCommand/TCC/4NT rem ----------------------------- rem magic characters (configurable) rem & joins commands, rem ^ is esc char to next char to allow magic chars rem ^ at line end, makes following line as if one with this one. rem > redirect output rem < redirect input rem % macro replacement rem [] function parameters rem @ function name rem ----------------------------- rem get a list of fully qualified directory names in this directory tree, not including . and .. rem Note [for] uses /r for recursive where [dir] uses /s dir /b /a:d /s rem ----------------------------- rem get a list of *.java files in the current directory tree last updated in the range 2010-12-25 to 2010-12-31 dir /[d2010-12-31,-6] /s *.java rem ----------------------------- rem get a list of fully qualified file names in this directory tree dir /b /a:-d /s rem ----------------------------- rem get a list of fully qualified directory and file names in this directory tree dir /b /s rem ----------------------------- rem capture a list of fully qualified *.html file names in this directory tree dir /b /a:-d /s *.html > temp.txt rem ----------------------------- rem get a files in the java files in current directory in order by date, last modified = newest last dir /b /o:d *.java rem ----------------------------- rem get list of files any of the following attributes: rem R Read-only rem H Hidden rem S System rem A Archive rem D Directory rem E Encrypted rem C Compressed rem I Not content-indexed rem J Junction rem L Symbolic link or Junction rem N Normal (cannot be used for file selection. no other attribs) rem O Offline rem P Sparse file rem T Temporary Rem find files that are hidden AND system AND not compressed dir /b /a:+h+s-c rem ----------------------------- rem pdir is a roll-your own programmable dir command where you get to decide what fields you want, rem how wide and what format, in this case the filname(2) and the description pdir /(fn 20 i) rem ----------------------------- rem delete an entire directory tree, both files and subdirs rem /S=subdir /E=suppress errors /X=delete empty dirs /Y=yes to prompts del E:\stuff /SEXY rem ----------------------------- rem copy just the changed files in a directory tree to a duplicate on another machine. rem XCOPY's intelligence is doing this, not 4NT's. rem /S=subdir /E=copy empty /Y=yes to prompts /D=date newer than target xcopy E:\intellij\*.* \\roedyacer\E\intellij\ /SEYD rem ----------------------------- rem convert all files in the current directory to pure lower case for %i in (*.*) do rename %i %@LOWER[%i] rem ----------------------------- rem for each jar in the directory tree, run jarlook, rem redirecting the output to xxx.look where xxx.jar rem was the name of the jar. rem Note [for] uses /r for recursive where [dir] uses /s for /r %i in (*.jar) do jarlook.exe %i > %@NAME[%i].look rem ----------------------------- rem detect files that have duplicate gif/png versions. for %i in (*.gif) do if exist %@NAME[%i].png echo %i has gif/png duplicates rem other useful functions on filenames: rem @EXT File extension rem @FILENAME File name and extension rem @FULL Full file name with path rem @NAME File name without path or extension rem @PATH File path without name rem @TRUENAME canonical name of a file rem ----------------------------- rem generate a bat file that can later be used to rename files rem chopping off the first 6 chars off each filename empty C:\temp\temp.bat echo generating rename commands in temp.bat for %i in (*.*) do echo rename %i %@instr[6,,%i] >> temp.bat pause echo running rename commands in temp.bat call C:\temp\temp.bat del C:\temp\temp.bat rem ----------------------------- rem compare two directories to see where file lengths have changed for %i in (*.java) do ( set file1=E:\old\jgloss\%i set file2=E:\current\jgloss\%i if not %@FILESIZE[%file1] == %@FILESIZE[%file2] echo %i ) rem ----------------------------- rem Pick the more compact: the *.jpg or the *.png, delete the bigger one. rem Note no quotes in IF to get a numeric compare rem If .png bigger delete png for %i in (*.png) if exist %@NAME[%i].jpg if %@FILESIZE[%i] GT %@FILESIZE[%@NAME[%i].jpg] del %i rem If .jpg bigger, or equal delete jpg. There is no such thing as as ELSE for %i in (*.png) if exist %@NAME[%i].jpg if %@FILESIZE[%@NAME[%i].jpg] GE %@FILESIZE[%i] del %@NAME[%i].jpg rem ----------------------------- rem run tidy.btm in each of the subdirectories of the E:\com\mindprod tree e: cd E:\com\mindprod rem echo %cd %d shows us that %d gives each directory in the tree rem where %cd gives us its parent. rem /a:d attribute directory, /r recursive, /h hide dots rem Visits directories more than once because of . and .. without /h rem cd needed since for, unlike global, does not change the cwd. rem Note that the there is no automatic CD on the discovered directory. rem Note [for] uses /r for recursive where [dir] uses /s for /a:d /r /h %d in (*.*) do ( echo %cd & echo %d & call tidy.btm %d ) rem ----------------------------- rem Prepares _O_V_E_R_V_I_E_W.txt files from 4NT DESCRIPT.ION files for the current directory tree rem by running mkoverview.btm in each subdirectory. Goes only one level deep. rem pushd/popd allow us to put current directory back the way it was. for /h /a:d %d in (*.*) do ( pushd & cd %d & echo %cd & call mkoverview.btm NOECHO & popd ) rem ----------------------------- rem Prepares _O_V_E_R_V_I_E_W.txt files from 4NT DESCRIPT.ION files for the current directory tree rem by running mkoverview.btm in each subdirectory. Covers all levels. rem pushd/popd allow us to put current directory back the way it was. rem Note [for] uses /r for recursive where [dir] uses /s for /h /r /a:d %d in (*.*) do ( pushd & cd %d & echo %cd & call mkoverview.btm NOECHO & popd ) rem ----------------------------- rem conditional copy e: cd E:\com\mindprod rem scan the \com\mindprod tree for files of the form *.use. rem When you find one, only if there is also a version.txt in that directory rem copy that *.use file to uses.txt. rem this works because %cd matches the directory of the found *.use file. rem Note [for] uses /r for recursive where [dir] uses /s for /r /h %u in (*.use) do ( if exist %cd\version.txt copy %u %cd\uses.txt ) rem ----------------------------- rem run all the just.bat files in the current directory tree rem the [a] is a fake regex wildcard kludge. rem Note [for] uses /r for recursive where [dir] uses /s for /r %d in (just.b[a]t) do call just.bat rem ----------------------------- rem conditionally rebuild Jet exe from jar only if it out of date pushd C: CD E:\com\mindprod\converter if %@FILEAGE[converter.exe] GT %@FILEAGE[converter.jar] goto done call rejet.btm :done popd rem ----------------------------- rem strip off path and extension, and/or convert to an associated extension set f=%@NAME[%1] echo processing %f%.html rem ----------------------------- rem multiple commands one line. rem for each *.java file in the current directory, copy it to temp.txt, rem and run the blout utility on temp.txt. If the result temp.txt is a different rem length than the original file, replace the original file with it. for %i in (*.java) do ( copy "%i" temp.txt & C:\sys\blout.exe temp.txt & ^ if %@FILESIZE["%i"] != %@FILESIZE[temp.txt] copy temp.txt "%i" ) rem ----------------------------- rem multiple commands, multiple lines. rem nested ifs, recursively run proofs.bat in each "real" directory rem in the tree where there are some Java files rem Note [for] uses /r for recursive where [dir] uses /s rem Beware. Do not tidy so () are on a line by themselves. for /a:d /r %d in (*.*) do ( if "%@right[4,%d]" != "^\raw" ( if "%@right[3,%d]" != "^\.." ( if "%@right[2,%d]" != "^\." ( if exist %d\*.java ( echo %d cd %d call C:\ENV\proofs.bat ))))) rem ----------------------------- rem detect if running under 4NT if "%@eval[2+2]" == "4" loadbtm on rem ----------------------------- rem display date, time timezone and cdrom drives available echo %_date %_time %_tzn %_cdroms rem displays: 2007-04-13 19:18:09 Pacific Daylight Time R: rem ----------------------------- rem control bat files with a string containing a letter coding rem for each step you want to execute. rem e.g. set whattodo=ACD rem Then before each step use code like this: if "%@index[%whattodo,A]" == "-1" goto bypassstepA ... if "%@index[%whattodo,B]" == "-1" goto bypassstepB ... if "%@index[%whattodo,C]" == "-1" goto bypassstepC ... if "%@index[%whattodo,D]" == "-1" goto bypassstepD ... rem in a real example you would use more mnemonic letter names. rem ----------------------------- rem convert Unicode 16LE *.htm files generated by PADGen to ordinary ASCII rem e.g. native2ascii.exe -encoding x-UTF-16LE-BOM myprog.htm myprog.html for %i in (*.htm) do native2ascii.exe -encoding x-UTF-16LE-BOM %i %@NAME[%i].html rem ----------------------------- rem change last modified/write date of the file, presuming DIR displays in YYYY-MM-DD format. rem /D must precede the filename. touch /Dw2007-01-31 temp.txt rem ----------------------------- rem check if there are any files dated 1:15 PM today (local time) or later. if exist *.* /[d0@1:15p] echo "recent files found" rem ----------------------------- rem check if past 1:15 PM today (local time) if %@time[%_time] GT %@time[13:15] echo It is already past 1:15 PM! rem ----------------------------- rem check if a file was updated today if %@FILEDATE["E:\com\mindprod\currcon\currcon.jar"] EQ %_date goto done rem ----------------------------- rem rename all the all.bat files to all.btm in the current directory tree. Don't use rename /S. rem global has a built-in /S. rem global nearly always needs the /I option, or it stops on first failed if exist etc. global /I rename /E all.bat all.btm rem ----------------------------- ::The cdd command alone is worth the entire package. It lets you jump to ::any directory on any disk just by typing a few letters of its name, and if ::there are duplicates that fit the pattern, by selecting the one you want. ::It saves thousands of keystrokes every day. rem ----------------------------- rem the SET command lets you change the master permanent sets you normally need to configure rem in the control panel. This lets you create a btm file that will put all your sets rem back to right if you have to reinstall Windows or you suspect some of your sets may have been damaged : e.g. set /E /S ANT_HOME=F:\Program Files (x86)\apache-ant-%antVersion% set /E /S BROWSER=F:\Program Files (x86)\Mozilla Firefox\firefox.exe set /E /S CATALINA_HOME=F:\Program Files\apache-tomcat-%TomcatVersion% set /E /S cert=mindprodcert2011dsa set /E /S CLASSPATH=.;E:\;E:\exper set /E /S ComSpec=F:\Program Files\JPSoft\TCMD16x64\TCC.EXE rem ... rem -30-