PKARP@SRI-ROBOTX.ARPA (Peter Karp) (04/27/88)
Many VMS programs (DCL and otherwise) don't expand wildcards in
filenames. The command procedure below makes it easy to execute
an arbitrary program over an arbitrary filespec. Enjoy...
$! Invocation: @FORFILES FILESPEC CMD
$!
$! Written by Peter D. Karp
$!
$! This command procedure executes the DCL command CMD once for every
$! file indicated by FILESPEC. On each execution, a different filename
$! specified by FILESPEC is substituted for each occurrence of the string
$! "FILE" in CMD, e.g.,
$!
$! $ @FORFILES *.COM "DIFF FILE OTHER_DIR:FILE"
$!
$!
$ on control_y then goto eof
$!
$! Get the list of specified files. Default to latest version only.
$!
$ filespec = f$parse(p1,";0")
$ dir/output=sys$login:filelist.tmp/nohead/notrail/col=1 'filespec'
$!
$! For each file...
$!
$ open/read fileF sys$login:filelist.tmp
$!
$FILE_LOOP:
$!
$! Read its name and type.
$!
$ read/end_of_file=EOF fileF full_filename
$ name = f$parse(full_filename,,,"NAME")
$ type = f$parse(full_filename,,,"TYPE")
$ filename = name + type
$!
$! Now substitute 'filename' for every occurrence of "FILE" in CMD.
$!
$ cmd = p2
$!
$ SUBST_LOOP:
$ pos = f$locate("file", cmd)
$ if pos .ne. f$length(cmd) Then Goto SUBST_MATCH
$ pos = f$locate("FILE", cmd)
$ if pos .eq. f$length(cmd) Then Goto DONE_SUBST
$ SUBST_MATCH:
$ cmd = f$extract(0,pos,cmd) + filename -
+ f$extract(pos+4,f$length(cmd)-pos-4,cmd)
$ goto SUBST_LOOP
$DONE_SUBST:
$!
$! Execute the command!
$!
$ write sys$output "$ ''cmd'"
$ 'cmd'
$!
$ goto FILE_LOOP
$!
$EOF:
$
$ close fileF
$ delete sys$login:filelist.tmp;*
-------