Zum Inhalt springen

batch script


doldo
 Teilen

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 !!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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=

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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=

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

×
×
  • Neu erstellen...