PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : batch script



doldo
27-01-2010, 13:51
Hallo,

ich möchte diesen command in einem batch script unter der dos shell laufen lassen...startet den sqlloader!

for %%i in (*.ctl) do sqlldr80 test/test@DB control=%MIC_CTLDIR%%%i data=%TARIFDIR%%%i

Das File für %control% hat die endung *.ctl,
das File für %data% hat die endung *.txt

wenn ichs so mache wie oben list er für %data% eben "file.ctl" ein, es sollte aber "file.txt" heißen, wie kann ich die Dateierweiterung von %%i ändern ?

Danke!
doldo

krusher
27-01-2010, 14:36
for /f "tokens=1-2 delims=." %%i in ('dir *.ctl /b') do sqlldr80 test/test@DB control=%MIC_CTLDIR%%%i.%%j data=%TARIFDIR%%%i.txt

doldo
27-01-2010, 14:53
danke,
das mit dem /f habe ich auch gerade rausgefunden!
was ich nicht 100% verstehe ist das "tokens=1-2 delims=." und dem %i.%%j
aber es funktioniert...
Danke!!!

krusher
27-01-2010, 15:05
tokens=1-2 delim=. macht aus dem zeug in den () eben die zwei teile und speichert sie in fortlaufenden variablen (%%i und %%j) ab: wenn du dir die ausgabe von "dir *.ctl /b" ansiehst, kommt da sowas wie filename1.ctl raus => das tokens-zeug trennt das bei delim (also .) auf in filename1 (=%%i) und ctl (=%%j). diese werte kann man dann nachher weiterverwenden...
das geht natürlich mit verschiedenen delim-characters, unterschiedlichen tokens usw...

dos war schon nicht so schlecht manchmal ;)

doldo
27-01-2010, 15:13
Thx!

doldo
28-01-2010, 09:30
tokens=1-2 delim=. macht aus dem zeug in den () eben die zwei teile und speichert sie in fortlaufenden variablen (%%i und %%j) ab: wenn du dir die ausgabe von "dir *.ctl /b" ansiehst, kommt da sowas wie filename1.ctl raus => das tokens-zeug trennt das bei delim (also .) auf in filename1 (=%%i) und ctl (=%%j). diese werte kann man dann nachher weiterverwenden...
das geht natürlich mit verschiedenen delim-characters, unterschiedlichen tokens usw...

dos war schon nicht so schlecht manchmal ;)

jetzt hätt ich noch ein feature eingebaut....
ist es möglich den Filenamen (%%i) so zu ändern dass ich "-5" abziehe vom Namen ?

momentan ist es ja so, er sucht sich zum File 4000.ctl das textfile 4000.txt und führt eine Aktion aus!

jetzt wär es lässig wenn zu 4000.ctl kein 4000.txt existiert, dass er nach 3995.txt sucht !!

Rowerek
28-01-2010, 10:43
jetzt hätt ich noch ein feature eingebaut....
ist es möglich den Filenamen (%%i) so zu ändern dass ich "-5" abziehe vom Namen ?

momentan ist es ja so, er sucht sich zum File 4000.ctl das textfile 4000.txt und führt eine Aktion aus!

jetzt wär es lässig wenn zu 4000.ctl kein 4000.txt existiert, dass er nach 3995.txt sucht !!

Nur so als Beispiel, wie es gehen könnte:



set /a var=1000-5


In Komination mit IF EXIST bekommst du das sicherlich hin.

Für komplexere Scripts würde ich die Windows Batchfiles hinter mir lassen, und cygwin installieren, dann kannst du "vollwertige" bash Scripts schreiben.

krusher
28-01-2010, 10:43
ab jetzt kostets geld :D :U:

@echo off&set cnt=
for /f "tokens=1-2 delims=." %%i in ('dir *.ctl /b') do set /a cnt=%%i

IF NOT EXIST %%i.txt GOTO LOWERFILE
sqlldr80 test/test@DB control=%MIC_CTLDIR%%%i.ctl data=%TARIFDIR%%%i.txt
goto :END

:LOWERFILE
set /a cnt=%cnt%-5
sqlldr80 test/test@DB control=%MIC_CTLDIR%%%i.ctl data=%TARIFDIR%%cnt%.txt

:END
set cnt=

Rowerek
28-01-2010, 10:49
Du kannst dir übrigens das ganze "tokens" Zeugs sparen, weil du die einzelnen Namensteile eines Dateinamens auch so einfach extrahieren kannst, siehe "for /?"



Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert.
Sie können jetzt folgende Syntax verwenden:

%~I - Expandiert %I und entfernt alle umschließenden
Anführungszeichen (").
%~fI - Expandiert %I zu einem vollständigen Dateinamen.
%~dI - erstellt nur den Laufwerkbuchstaben von %I.
%~pI - erstellt nur den Pfad von %I.
%~nI - erstellt nur den Dateinamen von %I.
%~xI - erstellt nur die Dateierweiterung von %I.
%~sI - erstellter Pfad enthält nur kurze Dateinamen.
%~aI - erstellt die Dateiattribute von %I.
%~tI - erstellt Datum und Zeit von %I.
%~zI - erstellt die Dateigröße von %I.
%~$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
angegebenen Verzeichnisse und expandiert die erste
gefundene Datei %I zu dem vollständigen Dateinamen.
Wenn der Name der Umgebungsvariablen nicht definiert
ist oder diese Datei bei der Suche nicht gefunden wurde,
wird dieser Parameter zu einer leeren Zeichenfolge
expandiert.

Diese Parameter können auch miteinander kombiniert werden:

%~dpI - erstellt den Laufwerkbuchstaben und Pfad von %I.
%~nxI - erstellt den Dateinamen und die Dateierweiterung von %I.
%~fsI - Expandiert %I zu einem vollständigen Namen, der nur
kurze Dateinamen enthält.
%~dp$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
angegebenen Verzeichnisse nach %I und erstellt den
Laufwerkbuchstaben und Pfad der ersten gefundenen Datei.
%~ftzaI - Expandiert %I zu einer Zeile, die der Ausgabe des DIR-
Befehls entspricht.

In den angegebenen Beispielen können %I und PATH durch andere gültige
Werte ersetzt werden. Der Ausdruck %~ wird durch einen gültigen Variablen-
namen für FOR abgeschlossen. Die Verwendung von Großbuchstaben für die Namen
von Variablen, wie z. B. %I, macht diese Ausdrücke leichter lesbar und
vermeidet Verwechslungen mit den eigentlichen Parametern.

krusher
28-01-2010, 11:03
danke für den hinweis :)

sollte dann so gehen:

@echo off
for %%I IN (*.ctl) do set /a cnt=%%~nI

IF NOT EXIST %cnt%.txt GOTO LOWERFILE
sqlldr80 test/test@DB control=%MIC_CTLDIR%%cnt%.ctl data=%TARIFDIR%%cnt%.txt
goto :END

:LOWERFILE
set /a lcnt=%cnt%-5
sqlldr80 test/test@DB control=%MIC_CTLDIR%%cnt%.ctl data=%TARIFDIR%%lcnt%.txt

:END
set cnt=
set lcnt=

Rowerek
28-01-2010, 11:28
danke für den hinweis :)

sollte dann so gehen:

@echo off
for %%I IN (*.ctl) do set /a cnt=%%~nI

IF NOT EXIST %cnt%.txt GOTO LOWERFILE
sqlldr80 test/test@DB control=%MIC_CTLDIR%%cnt%.ctl data=%TARIFDIR%%cnt%.txt
goto :END

:LOWERFILE
set /a lcnt=%cnt%-5
sqlldr80 test/test@DB control=%MIC_CTLDIR%%cnt%.ctl data=%TARIFDIR%%lcnt%.txt

:END
set cnt=
set lcnt=

Ah, wenn ich mir deinen Code so ansehe, kommen mir doch noch Bedenken. :f:
Es wird nämlich genau eine Aktion mit sqlldr80 durchgeführt werden, nämlich die letzte ;)
In VBA würde hier das NEXT fehlen, in cmd.exe fehlen wohl ein Paar Klammern und Ampersand.
Ja, die Batchverarbeitung in Win$ ist ein Hund :D

doldo
28-01-2010, 12:35
respekt jungs...danke!

krusher
28-01-2010, 13:58
Ah, wenn ich mir deinen Code so ansehe, kommen mir doch noch Bedenken. :f:
Es wird nämlich genau eine Aktion mit sqlldr80 durchgeführt werden, nämlich die letzte ;)
In VBA würde hier das NEXT fehlen, in cmd.exe fehlen wohl ein Paar Klammern und Ampersand.
Ja, die Batchverarbeitung in Win$ ist ein Hund :D

du hast recht :f:

statt dem setzen der variable muss da natürlich ein aufruf an ein anderes batchscript rein, dass dann die weiter unten stehenden aktionen macht :eek: manchmal sollt ich mir doch mehr zeit nehmen zum nachdenken...