Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch mit mehrfachem Aufruf eines Perlscripts für jede Datei in einem Verzeichnis

Frage Entwicklung Batch & Shell

Mitglied: Trainee07

Trainee07 (Level 1) - Jetzt verbinden

02.11.2007, aktualisiert 14.11.2007, 3399 Aufrufe, 6 Kommentare

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:

01.
:prg21 
02.
	set /p lognr="Bitte vierstellige Logfilenummer eingeben: " 
03.
	cd Logfiles 
04.
	if exist *%lognr%.log goto logistda 
05.
		echo. 
06.
		echo Logfile %lognr% nicht gefunden! 
07.
		cd.. 
08.
		pause 
09.
	        goto ENDE21  
10.
				 
11.
	:logistda  
12.
		echo. 
13.
		echo Logfile %lognr% vorhanden 
14.
		cd.. 
15.
		echo %LINE% 
16.
		cd Logfiles 
17.
		for /F %%i in ('dir /b /A:-d /o:n "*%lognr%.log"') do Set "logf=%%i" 
18.
		cd.. 
19.
		echo Aufruf von scanlog.pl mit der Datei %logf% 
20.
		echo %LINE% 
21.
		perl scanlog.pl %logf% %lognr% 
22.
		echo %LINE% 
23.
		set lognr=NUL1 
24.
		set logf=NUL2 
25.
	pause 
26.
: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
Mitglied: Biber
02.11.2007 um 18:51 Uhr
Moin Trainee07,

willkommen im Forum.

Um ein bisschen den Wiedererkennungswert der Batchdatei zu erhalten, habe ich nur ein paar kosmetische Änderungen gemacht.

01.
@echo off & setlocal 
02.
Set "myRoot=X:\Logauswertung" 
03.
Set "LogDir=%myRoot%\Logfile" 
04.
Set "SumDir=%myRoot%\Gescannte Logfiles" 
05.
 
06.
:prg21 
07.
 
08.
	set /p lognr="Bitte vierstellige Logfilenummer eingeben /leer für alle: " 
09.
	if exist "%LogDir%\*%lognr%.log" goto logistda 
10.
		echo. 
11.
		echo Logfile %lognr% nicht gefunden! 
12.
		pause 
13.
	        goto ENDE21  
14.
				 
15.
	:logistda  
16.
		echo. 
17.
		echo Logfile %lognr% vorhanden 
18.
		for /F %%i in ('dir /b /A:-d /o:n "%LogDir%\*%lognr%.log"') do Call :ProcWpl "%%~i" 
19.
         goto :Ende21 
20.
 
21.
:ProcWpl 
22.
for /f "tokens=2 delims=_" %i in ("%~n1") do Set lognr=%%i 
23.
		echo Aufruf von scanlog.pl mit der Datei %1 
24.
REM ??		echo %LINE% 
25.
                                PushDir "%SumDir%   
26.
		perl scanlog.pl %~1 %lognr% 
27.
		PopD 
28.
		Goto :eof 
29.
:::~~~~~~~ Ende des Call-Blocks "ProcWpl" ("Process with Perl")		 
30.
REM ??		echo %LINE% 
31.
REM ??		set lognr=NUL1 
32.
REM ??		set logf=NUL2 
33.
 
34.
	pause 
35.
: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
Bitte warten ..
Mitglied: Trainee07
02.11.2007 um 21:06 Uhr
Hallo Biber,
vielen Dank für die schnelle Antwort, ich habe deinen Vorschlag direkt umgesetzt und muss zugeben dass mir das mit den cd.. Zeilen auch nicht gefallen hat.
Auch hat allein dein Vorschlag dazu geführt, dass ich ungefähr nur noch etwas mehr als die hälfte an code habe wie vorher ^^
Hatte natürlich für die Option "alle Logfiles scannen" eine eigene fast identische Funktion schreiben wollen *stirnklatscher*

Wichtig war mir jedenfalls, dass ich den Ordner "Logauswertung mit all seinem Inhalt überall hinkopieren kann, bzw auch auf andere Rechner und das Script läuft, vorausgesetzt man hat Activeperl vorher installiert.
Deswegen habe ich mit set "myRoot=%~dp0" gearbeitet. Und mit Hilfe einiger Anführungszeichen funktioniert "dir" jetzt auch mit Pfaden deren Ordnernamen Leerzeichen enthalten.

Nur leider funktioniert das mit /leer für alle Dateien nicht:
Er nimmt dann das Logfile der letzten Runde, scannt das auch wobei die Meldung
"Der Befehl Pushdir ist entweder falsch geschrieben oder konnte nicht gefunden werden" erscheint.
Vielleicht könntest du die Zeile mit Pushdir und
for /f "tokens=2 delims=_" %%i in ("%~n1") do Set lognr=%%i
auch noch ein bisschen näher erläutern ?

Wobei eigentlich der Ordner "Gescannte Logfiles" nur im Perlscript verwendet wird um halt da die Ausgabedateien abzulegen.


Hier nochmal Version 1.3 der Batch:

[code]
@echo off
setlocal
rem
::
:: ScanLOG V1.3
::
rem ----------------------------------------------------------------------
:: History
:: V1.0 - 2007-11-01 menü erstellt, scannt ausgewählte logfiles
:: V1.3 - 2007-11-02 fragt settings ab, scannt komplettes logverzeichnis
rem

rem ----------------------------------------------------------------------
:: CONFIG
rem ----------------------------------------------------------------------
cls
set sTitle=ScanLOG V1.3
set LINE=-------------------------------------------------------------------

set "myRoot=%~dp0"
set "LogDir=%myRoot%Logfiles"
set "sumdir=%myRoot%Gescannte Logfiles"

rem ----------------------------------------------------------------------
:: MAIN
rem ----------------------------------------------------------------------
:menue
echo %LINE%
echo.
echo %sTitle%
echo.
echo %LINE%
echo.
echo.
echo 1 - Liste vorhandener Logfiles anzeigen
echo 2 - Logfile(s) scannen
echo 3 - Gescannte Logfile(s) plotten [beta]
echo 0 - Raus hier
echo.
echo.
set %AuswahlEingabe%=
set /p AuswahlEingabe=Eingabe:
if %AuswahlEingabe% equ 1 goto prg1
if %AuswahlEingabe% equ 2 goto prg2
if %AuswahlEingabe% equ 3 goto prg3
if %AuswahlEingabe% equ 0 goto exit
goto menue
rem ----------------------------------------------------------------------
:prg1
cls
dir "%LogDir%" /b /o
pause
cls
goto menue
rem ----------------------------------------------------------------------
:prg2
:menue2
cls
echo.
echo %LINE%
dir "%LogDir%" /b /o
echo %LINE%
echo 1 - Logfile(s) scannen
echo 2 - ???
echo 0 - zurueck
echo.
echo.
set /p AuswahlEingabe=Eingabe:
if %AuswahlEingabe% equ 1 goto prg21
if %AuswahlEingabe% equ 2 goto prg22
if %AuswahlEingabe% equ 0 goto menue
goto menue2
rem ----------------------------------------------------------------------
:prg21
set /p lognr="Bitte vierstellige Logfilenummer eingeben oder /leer fuer alle: "
if exist "%LogDir%\*%lognr%.log" goto worklog
echo.
echo Logfile %lognr% nicht gefunden!
pause
goto prg2

:worklog
echo.
echo Logfile %lognr% vorhanden
for /f %%i in ('dir /b /A:-d /o:n "%LogDir%\*%lognr%.log"') do Call :ProcWpl "%%~i"
goto prg2

:ProcWpl
for /f "tokens=2 delims=_" %%i in ("%~n1") do Set lognr=%%i
echo Aufruf von scanlog.pl mit der Datei %1
echo %LINE%
PushDir "%SumDir%
perl scanlog.pl %~1 %lognr%
PopD
echo %LINE%
pause
cls
goto menue
REM ?? set lognr=NUL1
REM ?? set logf=NUL2
rem ----------------------------------------------------------------------
:prg3
echo.

:setup
echo Bitte auswaehlen:
set /p sys="Censored Konfig [1], Censored Konfig [2]: "
if %sys% equ 1 goto sys1
if %sys% equ 2 goto sys2
echo Eingabe ungültig
pause
goto prg3

:sys1
echo k1 > settings.txt
goto tol

:sys2
echo k2 > settings.txt

:tol
set /p tol="Anzahl tolerierter "40"-errors? "
echo t%tol% >>settings.txt
echo %LINE%
echo Scilab wird gestartet
echo Im aktiven Codefenster von plot.sce STRG+L druecken um zu plotten
pause
plot.sce
echo %LINE%
pause
cls
goto menue

:exit
goto END
endlocal

rem ----------------------------------------------------------------------
:: the end of all
rem ----------------------------------------------------------------------
:END
echo %LINE%
rem echo %0 was terminated.
echo press any key...
pause >nul

rem
:: EOF
rem
[/code]
Bitte warten ..
Mitglied: Biber
03.11.2007 um 00:35 Uhr
Moin Trainee07,

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 .... %%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
Bitte warten ..
Mitglied: bastla
03.11.2007 um 09:13 Uhr
Hallo Trainee07!

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:
01.
set lognr=
Das solltest Du eigentlich mit allen einzugebenden ("set /p") Variablen so machen, wenn der entsprechende Programmteil mehrmals durchlaufen werden kann/soll.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
05.11.2007 um 22:03 Uhr
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..
01.
:ProcWpl 
02.
for /f "tokens=2 delims=_" %%i in ("%~n1") do Set lognr=%%i
geändert werden in ...
01.
:ProcWpl 
02.
for /f "tokens=2 delims=_" %%i in ("%~n1") do Set einejanzprivateVariable=%%i 
03.
....
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
Bitte warten ..
Mitglied: Biber
14.11.2007 um 22:55 Uhr
Trainee07??
Bist Du noch bei uns?

Besorgt
Biber
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch erst starten wenn bestimmte Datei vorhanden ist (7)

Frage von pdiddo zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...