loonie
Goto Top

FTP vom zOS Host per Batch automatisieren

Textdatei zeilenweise einlesen und Teilstrings weiterverarbeiten

Hallo,

für Migrationen möchte ich den Filedownload vom guten alten z/OS Host automatisieren. Bei einigen Hostdateien kenne ich den Namen (z.B. DATA1) bei anderen jedoch nur die Dateistufe und nicht die vorhandenen DSN. Meine Batchdatei sieht derzeit so aus:

set MYMAND=1234
set MYPFAD=h:\migration\%MYMAND%
set MYUSER=username
set MYPASSW=topsecre
md %MYPFAD%
cd %MYPFAD%
echo %MYUSER% > download.txt
echo %MYPASSW% >> download.txt
echo quote site sbd=(ibm-273,iso8859-1) >> download.txt
echo dir 'PROD.MIGRA.MAND%MYMAND%.*' >> download.txt  
echo get 'PROD.MIGRA.MAND%MYMAND%.DATA1' %MYPFAD%\mig_%MYMAND%_data1.txt >> download.txt  
echo quit >> download.txt
ftp -s:download.txt ourhost > downprot.txt
del download.txt

Die downprot.txt sieht dann so aus:
<-----schnipp-------
Verbindung mit ourhost hergestellt.
blabla
blabla
ftp> dir 'PROD.MIGRA.MAND1234.*'
200 Port request OK.
125 List started OK
Volume Unit Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
PRD256 3390 2007/10/16 1 15 VB 3999 27998 PS 'PROD.MIGRA.MAND1234.DATA1'
PRD253 3390 2007/10/16 1 15 VB 3999 27998 PS 'PROD.MIGRA.MAND1234.SA01A'
PRD252 3390 2007/10/16 1 15 VB 3999 27998 PS 'PROD.MIGRA.MAND1234.SA01B'
PRD256 3390 2007/10/16 1 15 VB 3999 27998 PS 'PROD.MIGRA.MAND1234.SA03A'
PRD256 3390 2007/10/16 1 15 VB 3999 27998 PS 'PROD.MIGRA.MAND1234.SA03B'
PRD256 3390 2007/10/16 1 15 VB 3999 27998 PS 'PROD.MIGRA.MAND1234.SA17A'
PRD256 3390 2007/10/16 1 15 VB 3999 27998 PS 'PROD.MIGRA.MAND1234.SA17B'
...
<-----schnapp-------

Es gibt Dateien mit SA00 - SA99, jeweils A und B. Das SA steht im Original an Stelle 115 und 116.
Die heruntergeladene Datei soll dann %MYPFAD%\mig_%MYMAND%_sa01a.txt usw. heißen.

Wie kann ich mir aus der downprot.txt eine neue download.txt basteln?
Oder gibt es einen ganz anderen Weg?

Vielen Dank und viele Grüße

Loonie

Content-ID: 71486

Url: https://administrator.de/contentid/71486

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

Biber
Biber 22.10.2007 um 08:47:37 Uhr
Goto Top
Moin Loonie,

willkommen im Forum.

Wenn Der DIR-Output in der Datei Downprot.txt so aussieht wie gepostet, dann solltest Du die einzelnen Member mit folgender (Test-) Zeile am CMD-Prompt rausfieseln können:
for /f "tokens=2 delims='" %i in ( 'findstr" "downprod.txt"') do @echo %i  
PROD.MIGRA.MAND1234.DATA1
PROD.MIGRA.MAND1234.SA01A
PROD.MIGRA.MAND1234.SA01B
PROD.MIGRA.MAND1234.SA03A
PROD.MIGRA.MAND1234.SA03B
PROD.MIGRA.MAND1234.SA17A
PROD.MIGRA.MAND1234.SA17B
Wenn Du das überprüft hast, dann kannst Du diese Zeile sinngemäß in einer Batchdatei verwenden und dort mit...

....
for /f "tokens=2 delims='" %%i in ( 'findstr" "downprod.txt"') do (  
   @for /f "tokens=1-4 delims=." %%a in ("%%i") do (  
   REM  %a.%b.%c.%d   entsppicht ganzem Namen (Pointer+Dataset)
   Echo get ' %i'   %Mypfad%\mig_%%c_%%d_data1.txt >>download2.txt  
))

Diese Datei Download2.txt kannst Du als neue Input-Datei nehmen (denke ich).
[ungetestete Skizze, da ich keinen z/OS-Server unterm Tisch habe]

Grüße
Biber
Loonie
Loonie 22.10.2007 um 15:42:06 Uhr
Goto Top
Hi Biber,

vielen vielen Dank für die schnelle Hilfe. Schade, dass Du keinen Host daheim hast face-wink
Ich geb in meiner Batch jetzt die Dateinamen mit ls anstelle von dir aus, da kommen nur die Dateinamen.

echo ls 'PROD.MIGRA.MAND%MYMAND%.*' /downdir.txt >> download.txt  

Die downdir.txt sieht dann so aus:
'PROD.MIGRA.MAND1234.DATA1'  
'PROD.MIGRA.MAND1234.SA01A'  
'PROD.MIGRA.MAND1234.SA01B'  
'PROD.MIGRA.MAND1234.SA03A'  
'PROD.MIGRA.MAND1234.SA03B'  
'PROD.MIGRA.MAND1234.SA17A'  
'PROD.MIGRA.MAND1234.SA17B'  

Leider hab ich den for /f bislang noch nicht kapiert...Wie krieg ich aus der downdir.txt folgende Form hin:
echo get 'PROD.MIGRA.MAND1234.DATA1' %MYPFAD\mig_%MYMAND_data1.txt >> download2.txt  
echo get 'PROD.MIGRA.MAND1234.SA01A' %MYPFAD\mig_%MYMAND_sa01a.txt >> download2.txt  
echo get 'PROD.MIGRA.MAND1234.SA01B' %MYPFAD\mig_%MYMAND_sa01b.txt >> download2.txt  
usw.
Muchas gracias. Viele Grüße

Loonie
Biber
Biber 22.10.2007 um 18:38:26 Uhr
Goto Top
Moin Loonie,

war ein Scherz - natürlich habe ich auch ein paar z/OS-Büchsen hier im Park.... face-wink

Also- wenn Du die Einschränkung auf die "richtigen" Datasets schon auf dem Host gemacht hast und somit ALLE Zeilen der Download.txt verwertet werden können, dann kannst Du folgende Simulation am CMD-Prompt GEFAHRLOS nachturnen:

>for /f "tokens=1-4 delims='." %a in (downprot.txt) do @echo get '%a.%b.%c.%d' mypfad\mig_%c_%d_data1.txt  
get 'PROD.MIGRA.MAND1234.DATA1' mypfad\mig_MAND1234_DATA1_data1.txt  
get 'PROD.MIGRA.MAND1234.SA01A' mypfad\mig_MAND1234_SA01A_data1.txt  
get 'PROD.MIGRA.MAND1234.SA01B' mypfad\mig_MAND1234_SA01B_data1.txt  
get 'PROD.MIGRA.MAND1234.SA03A' mypfad\mig_MAND1234_SA03A_data1.txt  
get 'PROD.MIGRA.MAND1234.SA03B' mypfad\mig_MAND1234_SA03B_data1.txt  
get 'PROD.MIGRA.MAND1234.SA17A' mypfad\mig_MAND1234_SA17A_data1.txt  
get 'PROD.MIGRA.MAND1234.SA17B' mypfad\mig_MAND1234_SA17B_data1.txt  
[Nur die erste Zeile, gekennzeichnet durch das ">"-zeichen wurde eingegeben, der Rest ist Output.]

Fir FOR/F -Anweisung zerlegt jede Zeile in der Input-Datei "downprot.txt" in einzelne Token und zwar immer dort, wo die definierten Delimiter "'" oder "." auftreten.
Somit besteht jede Zeile nur noch aus 4 Tokens (%a, %b, %c, %d), die im @echo-teil wieder passend zusammengestoppelt werden.
Spiel ein bisschen mit dieser Echo-Zeile am CMD-Prompt herum - hilft Dir mehr, als wenn ich Dir jetzt eine Zeichnung mache.

Wenn Du diese (sinngemäße) Zeile in einem Batch verwenden willst, musst Du jeweils statt einem %-Zeichen deren zwo eintippseln.
Also %%a statt %a, %%b statt b usw.

Gruß und saludos
Castor
Loonie
Loonie 22.10.2007 um 20:25:25 Uhr
Goto Top
for(i = 1; i <= 1000; ++i)
     printf("RESPECT BIBER!!!");  

Vielen vielen Dank.