Mere om Windows Command filer for iSeries nørder.

Mere om Windows Command filerda_DK I min seneste artikel skrev jeg om nogle af de nye faciliteter, der er kommet i de senere år i Windows Batch og Windows Command Filer (CMD). Jeg viste eksempler taget fra en CMD der bruges til at kopiere et iSeries library over i en pc fil. Hvad er mere passende, end at forsætte gennemgangen af muligheder ved at tage udgangspunkt i en CMD, der kan kopiere/installere objekterne fra en savefile (som blev lavet med cmd filen fra den første artikel) og ind på en iSeries? I denne artikel tager jeg udgangspunkt i værktøjet iInstall.cmd som jeg har udviklet.

Windows Command filer har nu mulighed for beregninger. Lad os starte med at kikke på denne del af iInstallParm.cmd:

...
set lictext1=Dette
set lictext2=er
set lictext3=et
set lictext4=eksempel
set lictext5=
...

Her angives hvad der skal blive til 4 liniers tekst på skærmen. Den femte linje afslutter rækken ved at environment variablen sættes til blank/ingen ting.

I iInstall.cmd finder vi dette kodeudsnit:

...
setlocal EnableDelayedExpansion
set /a "index=1"
:NextLine
set thisline=lictext%index%
if not "!%thisline%!" == "" (
    if "!%thisline%!" == "*" Echo.
    if not "!%thisline%!" == "*" call :c 02 "!%thisline%!" /n
    set /a "index+=1"
    Goto NextLine
)
...

Første nyere ting vi ser er ‘setlocal EnabledDelayedExpansion’. Dette betyder at variable bliver evalueret på udførselstidspunktet i stedet for det normale, som er på indlæsningstidspunktet. Den konkrete stump kode har det den virkning, at ‘thisline’ i løbet af loopet kommer til at indeholde navnene på de environment variabler der hedder ‘lictext1’, ‘lictext2’, ‘lictext3’ og så videre. Loopet kører indtil, for eksempel, ‘lictext5’ ikke er sat til en værdi.

Næste nyere ting er beregninger i form af ‘set /a “index=1” ‘ og ‘set /a “index+=1” ‘. Beregninger har i den grad manglet i CMD miljøet, og nu er de her. I ovenstående sætter jeg først ‘index’ til værdien 1 og derefter tæller jeg op i loopet. Det er også muligt at gange og dividere og benytte andre beregninger.

En nyere ting i Windows Command filer er muligheden for at afvikle flere kommandoer på samme linje.

If ""=="%~1" Del ` `.1 `.3 `.5 `.7 `.dat & Popd & Subst `: /d & Goto :Eof

I det ovenstående vil DEL, POPD, SUBST og GOTO blive udført når betingelsen i IF er opfyldt.

Man kunne have skrevet ovenstående linje på denne måde:

If ""=="%~1" (
Del ` `.1 `.3 `.5 `.7 `.dat
Popd
Subst `: /d
Goto :Eof
)

I visse tilfælde er det dog nemmere eller påkrævet at benytte metoden med &.

Kik gerne i både iInstall.cmd og SavLib.cmd for udførlige eksempler.

Et nyttigt lille værktøj

I den første artikel kikkede vi på CMD filen SavLib.cmd. Herunder er endnu en nyttig CMD fil som kopierer et library, JWTOOLSSRC i dette tilfælde, ud i en pc fil som navngives med dagsdato:

@Echo off
For /f "tokens=1-3 delims=- " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
Echo Call "%~dp0Savlib.cmd" JWTOOLSSRC "%~dp0JWToolsSrc-%mydate%.Savf"
Call "%~dp0Savlib.cmd" JWTOOLSSRC "%~dp0JWToolsSrc-%mydate%.Savf"
Echo.
Echo Savlib slut.
Pause

Det der er det særlige ved denne CMD fil er, at den benytter FOR udtrykket til at skille dags dato ad, og samle den igen i en anden orden. I FOR udtrykket angiver jeg, at jeg vil have 3 tokens tilbage, nemlig token 1, 2 og 3. Jeg angiver at de er adskilt af en streg. Jeg sætter %%a til at være den første variable der skal benyttes og der skal arbejdes på dét der kommer retur fra kommandoen ‘date /t’. ‘date /t’ betyder, at jeg vil have dagsdato i det format som Windows er sat op til tilbage. ‘/t’ angiver at datoen skal vises, ikke ændres som der det normale for ‘date’ kommandoen.

Det der udføres i FOR udtrykket er, at datoen nu bliver delt op i tre environment variable. Tag datoen 10-04-2016, den deles op således:

10 kommer ind i variablen %%a
04 kommer ind i variablen %%b
2016 kommer ind i vauablen %%c

Jeg kan nu opbygge en ny dato i ISO format ved at sætte disse tre environment variabler sammen ‘set mydate=%%c-%%b-%%a’.

Dét der kommer ud af det nyttige ligge værktøj er, at der tages en kopi af libraryet JWTOOLSSRC i en fil med dags dato i navnet. Således har jeg mulighed for at gå tilbage skulle det være nødvendigt 🙂

Links til nyttige sider:

Denne side har gode forklaringer, og eksempler, på de udtryk man kan bruge i CMD filer: ss64.com.