I've been writing a batch file to run some mathematical models over a set of inputs.
The models are software reliability growth models, described
here.
We are using
- du: Duane
- go: Goel and Okumto
- jm: Jelinski and Moranda
- kl: Keiller and Littlewood
- lm: Littlewood model
- lnhpp: Littlewood non-homogeneous Poisson process
- lv: Littlewood and Verrall
- mo: Musa and Okumoto
Littlewood appears many times: he founded the group where I currently work.
So, far too much background. I have one executable for each model, after making a make file; yet another story. And a folder of input files, named as f3[some dataset]du.dat, f3[some dataset]go.dat,... f3[some dataset]mo.dat. I also have some corresponding output files someone else produced a while ago, so in theory I can check I get the same numbers.I don't but that's going to be yet another story.
You can also use the original file and generated file to recalibrate, giving yet another file. Which I have previously generated results from. Which also don't match.
I wanted to be able to run this on Ubuntu and Windows, and managed to make a bash script easily enough. Then I tried to make a Windows batch file to do the same thing. I'll just put my final result here, and point out the things I tripped up on several times.
ECHO OFF
setlocal EnableDelayedExpansion
setlocal
for %%m in (du go jm kl lm lnhpp lv mo) do (
echo %%m
for %%f in (*_%%m.dat) do (
echo %%~nf
set var=%%~nf
echo var: !var!
set var=!var:~2!
echo var now: !var!
swrelpred\%%m.exe %%~nf.dat "f4!var!"
swrelpred\%%mcal.exe %%~nf.dat "f4!var!" "f9!var!"
)
)
1. First, turn the echo off because there's way too nosie otherwise.
2. Next, enable delayed expansion, otherwise things in blocks get expanded on sight and therefore don't change in the loop: "Delayed expansion causes variables delimited by exclamation marks (!) to be evaluated on execution" from stack exchanges' Superuser
site
3. Corollary: Use
! in the variables in the block not
% for delayed expansion.
4. But we're getting ahead of ourselves. The
setlocal at the top means I don't set the variables back at my prompt. Without this, as I changed my script to fix mistakes it did something different between two runs, since a variable I had previously set might end up being empty when I broke stuff.
5. "Echo is off" spewed to the prompt means I was trying to echo empty variables, so the
var: etc tells me which line something is coming from.
6.
!var:~2! gives me everything from the second character, so I could drop the f3 at the start of the filename and make f4 and f9 files to try a diff on afterwards. Again pling for delayed expansion.
I suspect I could improve this, but it's six importnat things to remember another time.
Writing this in Python might have been easier. Or perhaps I should learn Powrshell one day.