Batch mit mehrfachem Aufruf eines Perlscripts für jede Datei in einem Verzeichnis
und zwar mit Dateiabhängigen Übergabeargumenten
Hallo,
Ich habe folgende Situation:
Ordnerstruktur:
#Logauswertung (hier liegt die Batch Datei und das Perlscript)
-- #Logfiles (hier liegen die Logfiles, die wenn vorhanden alle nacheinander mit dem Perlscript bearbeitet werden sollen)
-- #Gescannte Logfiles (hier landen die Ausgabedateien des Perlscripts)
In meiner Batch lässt sich bis jetzt der Inhalt des Ordners "Logfiles" anzeigen wobei alle darin liegenden Dateien Dateinamen haben wie: 2007-10-30__1358.log.
Unter einem weiteren Menüpunkt lässt sich nun die vierstellige Nummer des Logfiles eingeben und daraufhin wird das Perlscript aufgerufen, jedoch mit dem Kompletten Dateinamen als erstes Übergabeargument und nochmal nur die Nummer als zweites Übergabeargument.
Den Vollständigen Dateinamen brauch ich um ihn dann im Perlscript als infile angeben zu können, die Nummer verwende ich um die Ausgabe Datei des Perlscripts dann passend zu benennen.
Also wie gesagt, mit Auswahl funktioniert das ganze jetzt schon und zwar so:
Jetzt möchte ich noch einen Menüpunkt einfügen "Alle im Verzeichnis vorhandene Logfiles scannen", weiss jedoch nicht wie ich das realisieren soll.
-Verzeichnis auf Vorhandensein prüfen
-Verzeichnis auf Logfiles prüfen
-Jedes Logfile mit komplettem Dateinamen und Logfilenummer als Übergabeargumente mit dem Perlscript aufrufen.
Ich will noch erwähnen, dass es meine erste Batchdatei ist die ich programmiere aber diese Seite hier hat mir bei meinem bisherigen Weg schon sehr geholfen.
Also ich bin schon sehr gespannt auf die Lösung eines Profis ^^
Gruß
Trainee07
Hallo,
Ich habe folgende Situation:
Ordnerstruktur:
#Logauswertung (hier liegt die Batch Datei und das Perlscript)
-- #Logfiles (hier liegen die Logfiles, die wenn vorhanden alle nacheinander mit dem Perlscript bearbeitet werden sollen)
-- #Gescannte Logfiles (hier landen die Ausgabedateien des Perlscripts)
In meiner Batch lässt sich bis jetzt der Inhalt des Ordners "Logfiles" anzeigen wobei alle darin liegenden Dateien Dateinamen haben wie: 2007-10-30__1358.log.
Unter einem weiteren Menüpunkt lässt sich nun die vierstellige Nummer des Logfiles eingeben und daraufhin wird das Perlscript aufgerufen, jedoch mit dem Kompletten Dateinamen als erstes Übergabeargument und nochmal nur die Nummer als zweites Übergabeargument.
Den Vollständigen Dateinamen brauch ich um ihn dann im Perlscript als infile angeben zu können, die Nummer verwende ich um die Ausgabe Datei des Perlscripts dann passend zu benennen.
Also wie gesagt, mit Auswahl funktioniert das ganze jetzt schon und zwar so:
:prg21
set /p lognr="Bitte vierstellige Logfilenummer eingeben: "
cd Logfiles
if exist *%lognr%.log goto logistda
echo.
echo Logfile %lognr% nicht gefunden!
cd..
pause
goto ENDE21
:logistda
echo.
echo Logfile %lognr% vorhanden
cd..
echo %LINE%
cd Logfiles
for /F %%i in ('dir /b /A:-d /o:n "*%lognr%.log"') do Set "logf=%%i"
cd..
echo Aufruf von scanlog.pl mit der Datei %logf%
echo %LINE%
perl scanlog.pl %logf% %lognr%
echo %LINE%
set lognr=NUL1
set logf=NUL2
pause
:ENDE21
Jetzt möchte ich noch einen Menüpunkt einfügen "Alle im Verzeichnis vorhandene Logfiles scannen", weiss jedoch nicht wie ich das realisieren soll.
-Verzeichnis auf Vorhandensein prüfen
-Verzeichnis auf Logfiles prüfen
-Jedes Logfile mit komplettem Dateinamen und Logfilenummer als Übergabeargumente mit dem Perlscript aufrufen.
Ich will noch erwähnen, dass es meine erste Batchdatei ist die ich programmiere aber diese Seite hier hat mir bei meinem bisherigen Weg schon sehr geholfen.
Also ich bin schon sehr gespannt auf die Lösung eines Profis ^^
Gruß
Trainee07
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 72593
Url: https://administrator.de/forum/batch-mit-mehrfachem-aufruf-eines-perlscripts-fuer-jede-datei-in-einem-verzeichnis-72593.html
Ausgedruckt am: 22.05.2025 um 02:05 Uhr
6 Kommentare
Neuester Kommentar
Moin Trainee07,
willkommen im Forum.
Um ein bisschen den Wiedererkennungswert der Batchdatei zu erhalten, habe ich nur ein paar kosmetische Änderungen gemacht.
wobei sich einige (bzw. die meisten) Anpassungen gar nicht auf Deine eigentliche Frage beziehen. Und zwar:
Ansonsten hab ich mich auf den Standpunkt gestellt:
Ist ungetestet, aber mal ein Anfang.
Grüße
Biber
willkommen im Forum.
Um ein bisschen den Wiedererkennungswert der Batchdatei zu erhalten, habe ich nur ein paar kosmetische Änderungen gemacht.
@echo off & setlocal
Set "myRoot=X:\Logauswertung"
Set "LogDir=%myRoot%\Logfile"
Set "SumDir=%myRoot%\Gescannte Logfiles"
:prg21
set /p lognr="Bitte vierstellige Logfilenummer eingeben /leer für alle: "
if exist "%LogDir%\*%lognr%.log" goto logistda
echo.
echo Logfile %lognr% nicht gefunden!
pause
goto ENDE21
:logistda
echo.
echo Logfile %lognr% vorhanden
for /F %%i in ('dir /b /A:-d /o:n "%LogDir%\*%lognr%.log"') do Call :ProcWpl "%%~i"
goto :Ende21
:ProcWpl
for /f "tokens=2 delims=_" %i in ("%~n1") do Set lognr=%%i
echo Aufruf von scanlog.pl mit der Datei %1
REM ?? echo %LINE%
PushDir "%SumDir%
perl scanlog.pl %~1 %lognr%
PopD
Goto :eof
:::~~~~~~~ Ende des Call-Blocks "ProcWpl" ("Process with Perl")
REM ?? echo %LINE%
REM ?? set lognr=NUL1
REM ?? set logf=NUL2
pause
:ENDE21
wobei sich einige (bzw. die meisten) Anpassungen gar nicht auf Deine eigentliche Frage beziehen. Und zwar:
- die ganzen Verzeichnisnamen sollten in Variablen. Eine Stelle zum Anpassen.
- diese Verzeichniswechselei mit "cd runter" und "cd .." ist unnötig und erschwert die Fehlersuche
Ansonsten hab ich mich auf den Standpunkt gestellt:
- entweder der verehrte User will und weiß eine %lognr%, dann läufts wie bisher
- oder er weiß oder will keine einzelne, sondern alle.
- Im zweiten Fall wird die %lognr% ermittelt.
- Okay, im ersten Fall unnötigerweise auch. Aber Bätche jammern ja nicht rum.
Ist ungetestet, aber mal ein Anfang.
Grüße
Biber
Moin Trainee07,
ist mir heute abend auch zu spät, mich noch ernsthaft damit zu befassen.... morgen wieder.
Nur kurz:
Siehe Hilfe "PopD /?" bzw "PushD /?" am CMD-Prompt.
Der %1 (Parameter 1), um den es hier geht, ist z.B. "D:\Logfiles\2007-11-01_1234.log".
Vom "ganzen" Parameter1 nur den Dateinamen %~n1 (ohne Extension) ist --> "2007-11-01_1234".
Das in Teile getrennt mit "Delims=_" ergibt :
Erstes Token "2007-11-01".
Zweites Token: "1234".
Soweit für heute.
Biber
ist mir heute abend auch zu spät, mich noch ernsthaft damit zu befassen.... morgen wieder.
Nur kurz:
"Der Befehl Pushdir ist entweder falsch geschrieben oder konnte nicht gefunden werden" erscheint.
Jepp, da hat M$ recht und ich unrechtt. Der Befehl heißt auch "PushD" ( und sein Partner "PopD").Siehe Hilfe "PopD /?" bzw "PushD /?" am CMD-Prompt.
Vielleicht könntest du die Zeile mit Pushdir und
for /f "tokens=2 delims=_" %%i in ("%~n1") do Set lognr=%%i
Ja. Heißt übersetzt:for /f "tokens=2 delims=_" %%i in ("%~n1") do Set lognr=%%i
For /F .... %%i in ({irgendeinText}) Do ....
->lese den Text in der Klammer wie eine Textdatei ("/F" = wie ein File)"tokens=2 delims=_"
-> nimm nur das zweite Token ("Teil" der Zeile), und zwar das zweite "Token", wenn Teile jeweils durch Zeichen "_" getrennt sind"%~n1"
Und das ist der Text, der zerlegt werden soll.Der %1 (Parameter 1), um den es hier geht, ist z.B. "D:\Logfiles\2007-11-01_1234.log".
Vom "ganzen" Parameter1 nur den Dateinamen %~n1 (ohne Extension) ist --> "2007-11-01_1234".
Das in Teile getrennt mit "Delims=_" ergibt :
Erstes Token "2007-11-01".
Zweites Token: "1234".
Soweit für heute.
Biber
Hallo Trainee07!
Als kurze Anmerkung zu
Das solltest Du eigentlich mit allen einzugebenden ("set /p") Variablen so machen, wenn der entsprechende Programmteil mehrmals durchlaufen werden kann/soll.
Grüße
bastla
Als kurze Anmerkung zu
Nur leider funktioniert das mit /leer für alle Dateien nicht:
Er nimmt dann das Logfile der letzten Runde ...
Wenn Du vor der Eingabe ("set /p lognr= ...") die Variable löschst, wird nicht mehr der vorige Wert verwendet - die Zeile dafür:Er nimmt dann das Logfile der letzten Runde ...
set lognr=
Grüße
bastla
Moin Trainee07,
zu bastlas Hinweis kann ich auch nur wenig ergänzen.... mit dieser Strategie sollte es laufen.
Zusätzlich (und der Code-Sauberkeit wegen) sollten eigentlich die Zeilen..
geändert werden in ...
Denn diese aus dem Dateinamen herausgepuhlte LfdNr wird zwar als Variable gebraucht, aber wirklich ja nur in diesem ":ProcWpl"-Block.
Die %lognr% außerhalb dieses Blocks hat eigentlich gar nichts damit zu tun.
Gib Bitte mal Feedback, ob ich mich halbwegs verständlich ausdrücken konnte, oder ob wir noch zusammen eine final version hier gemeinsam zusammenbraten wollen.
Grüße
Biber
zu bastlas Hinweis kann ich auch nur wenig ergänzen.... mit dieser Strategie sollte es laufen.
Zusätzlich (und der Code-Sauberkeit wegen) sollten eigentlich die Zeilen..
:ProcWpl
for /f "tokens=2 delims=_" %%i in ("%~n1") do Set lognr=%%i
:ProcWpl
for /f "tokens=2 delims=_" %%i in ("%~n1") do Set einejanzprivateVariable=%%i
....
Denn diese aus dem Dateinamen herausgepuhlte LfdNr wird zwar als Variable gebraucht, aber wirklich ja nur in diesem ":ProcWpl"-Block.
Die %lognr% außerhalb dieses Blocks hat eigentlich gar nichts damit zu tun.
Gib Bitte mal Feedback, ob ich mich halbwegs verständlich ausdrücken konnte, oder ob wir noch zusammen eine final version hier gemeinsam zusammenbraten wollen.
Grüße
Biber