Windows Command filer for iSeries nørder.

da_DK Windows Command filer kan også bruges til lave funktionelle værktøjer til iSeries. Hvis sidste gang du skrev en Windows Batch fil var i de glade MS-DOS eller Windows 95 dage, så er tiden kommet til at træde ind i en ny og spændende verden og opleve, at Windows Command filer, som de hedder nu om dage, er det nye sort 🙂

Min artikelserie beskriver nogle af de mange nye faciliteter, der er kommer i Windows Command filer, og hvordan de er brugt i nogle af mine værktøjer. Forhåbentlig bliver du inspireret til at lave dine egne Windows Command filer, der løser de opgaver som du sidder med.

Windows Command er et avanceret scriptsprog med mange spændende muligheder. Har du hentet et af mine værktøjer her på siden, har du stiftet bekendtskab med iInstall.cmd, som benytter en del af de nye muligheder til at installere en Savefile på din iSeries.

Vidste du at et script kan:

  • Bede brugeren om at indtaste informationer?
  • Konvertere data?
  • Afvikle subrutiner?
  • Lave beregninger?
  • Lave avanceret funktionalitet ved hjælp diverse medleverede Windows programmer?

I denne artikel kikker vi på en Windows Command fil, der kan overføre et library fra iSeries til pc’en. Command filen hedder SavLib.cmd, da dens funktionalitet tilsvarer iSeries kommandoen SAVLIB (Save Library). SAVLIB kommandoen bliver afviklet på iSeries af Command filen. Kort fortalt benytter SavLib.cmd Windows FTP klient til at udføre ‘det hårde arbejde’ på iSeries således, at man ikke skal indtaste en lang række af FTP kommandoer i FTP klienten.

Du kan downloade SavLib.cmd her.

De første nye udtryk jeg benytter i Command filen, benyttes til at sætte navnene på tre hjælpefiler. En til at holde det FTP script jeg vil have afviklet samt to logfiler. Den ene logfil bruges til at samle op i og efterlade hvis noget går galt, og den anden er en arbejdsfil.

set scriptfile="%~dp0%~n0.script"
set logfile="%~dp0%~n0.log"
set logfile2="%~dp0%~n02.log"

Kommandoen ‘%~dp0%~n0’ er faktisk to. ‘%~dp0’ giver drev og sti til parameter 0, hvor selve CMD er placeret, og ‘%~n0’ giver Command filens navn. Jeg benytter disse to kommandoer, da jeg vil ende med en fil der hedder det samme som SAVLIB Command filen og er placeret samme sted. Det samme gælder for de to log filer.

Det næste nye er brugen af parentes, ‘else’ samt ‘/p’ på ‘set’ udtrykket:

REM
REM If parameter is missing, ask for it.
REM
If "%3" == "" (
  Echo.
  set /p iseriesname= Enter DNS-name or IP of iSeries:
  ) Else (
  set iseriesname=%3
  )

‘/p’ efter ‘set’ udtrykket betyder, at brugeren skal indtaste informationen (‘prompt’). Teksten der står efter lighedstegnet, er den tekst der skal vises til brugeren. ‘/p’ er en mulighed vi har sukket efter lige siden batch filen blev opfundet, og den er absolut kærkommen.

Bemærk, at de betingede udtryk er sat i parentes og muligheden for at bruge ‘Else’.

Flere gange i SAVLIB Command filen opretter jeg dynamisk et script, som skal afvikles af FTP klienten:

REM
REM Create FTP script to be executed on the iSeries.
REM
Echo open %iseriesname% > %scriptfile%
Echo %user% >> %scriptfile%
Echo %pwd% >> %scriptfile%
Echo quote system >> %scriptfile%
Echo Quit >> %scriptfile%

Muligheden for at omdirigere output til en fil har altid eksisteret. Bemærk, at jeg i den første linje kun har en ‘>’, mens der er to ‘>>’ i de andre linjer. En ‘>’ betyder, at den fil der skrives til, skal erstattes; ‘>>’ betyder, at der skal tilføjes til filen.

Når FTP scriptet er oprettet, skal det afvikles:

REM
REM Execute FTP
REM
FTP -s:%scriptfile% > %logfile2% 2>&1

De forskellige parametre, efter kaldet til FTP klienten, angiver, at filen ‘%scriptfile%’ indeholder det script, der skal afvikles. ‘> %logfile2% 2>&1’ betyder, at output fra FTP klienten skal skrives til logfilen ‘%logfile2%’. ‘2>&1’ betyder, at både ‘Standard out’ og ‘Error out’ skal skrives til logfilen. Udelader man dette, ville kun svaret fra FTP kommandoer der blev gennemført med succes, blive skrevet til logfilen og dem der gik galt, ville blive skrevet på skærmen.

Når FTP klienten afslutter, bliver logfilen undersøgt for, om der opstod fejl:

FIND "530 " < "%logfile2%" > nul
If not errorlevel == 1 (
Echo.
Call :ErrHdr
Call :ErrDetLin "User id/password is not correct on target system."
Call :ErrFtr
Call :ErrFTPLog
Pause
Goto Exit
)

Jeg undersøger her, om der opstod en fejl med nummeret ‘530’. Den betyder, at brugerprofilen eller kodeord ikke er korrekt. Til at gøre dette kalder jeg et Windows program, der hedder FIND, som kan læse en fil og lede efter et argument. Hvis FIND finder argumentet, da sætter FIND system feltet ERRORLEVEL til 1, og den tester jeg på og kalder derefter en række subrutiner, som skriver fejlen ud på skærmen og i en logfil.

Netop subrutiner er en nyere ting i Batch/Command filer. En vigtig ting når man skal retur fra en subroutine, det er at man afslutter den med udtrykket ‘Exit /b’:

REM
REM Write Error detail line
REM on screen and in file.
REM -----------------------
:ErrDetLin
if "%~1" == "" Echo.
if not "%~1" == "" Echo %~1

if "%~1" == "" Echo. >> "%logfile%"
if not "%~1" == "" Echo %~1 >> "%logfile%"
Exit /b

Hvis du udelader ‘/b’ så vil selve Command filen afslutte.

Du har nu set nogle af de nye muligheder, der er kommet i Windows Command filer siden de glade MS-DOS og Windows 95 dage. Som du har set kan man lave ganske funktionelle og avancerede Window Command filer. Du kan downloade SAVLIB.CMD, og kikke den igennem, for der er flere spændende ting at kikke på i den. Du kan også blot bruge den til dét, den er lavet til, at overføre et library i en savefile nemt og enkelt 🙂

Links til nyttige sider: