Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Trainee07

Trainee07 (Level 1) - Jetzt verbinden

02.11.2007, aktualisiert 14.11.2007, 3443 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 ..
Ähnliche Inhalte
Batch & Shell

Batch Datei in zufälliges Verzeichnis navigieren

Frage von MarioBros778Batch & Shell4 Kommentare

Hey Leute, ich hätte da ein Frage: Ist es möglich mit einer cmd datei in ein zufälliges Verzeichnis zu ...

Batch & Shell

Batch-Datei soll überprüfen ob ein Verzeichnis vorhanden ist

gelöst Frage von synapsenstauBatch & Shell7 Kommentare

Moin, wie bringe ich bitte einer Batch-Datei bei, das sie "schaut" ob ein Verzeichnis vorhanden ist und wenn nicht ...

Entwicklung

Verzeichnise sichern mit batch datei (Win10)

gelöst Frage von LimbachEntwicklung13 Kommentare

Bitte um eure Hilfe für mein Problem. Ich möchte gerne ein Verzeichnis mit Unterverzeichnissen per Batch Datei mit win7 ...

Batch & Shell

Batch Datei - Verzeichnis kopieren funktioniert nicht - nur Dateien

gelöst Frage von inspiratioBatch & Shell12 Kommentare

Hallo zusammen, ich habe eine Batch Datei erstellt wo die Unterverzeichnisse von A nach B kopiert werden sollen: echo ...

Neue Wissensbeiträge
Administrator.de Feedback

Entwicklertagebuch: Datenschutzerklärung nach DS-GVO

Information von admtech vor 1 StundeAdministrator.de Feedback

Hallo Administrator User, Wir respektieren eure Privatsphäre und möchten euch daher auf die Möglichkeiten für den Umgang mit euren ...

Voice over IP

Rufnummernblock aufbrechen nun möglich bei DTAG

Tipp von Datenreise vor 5 StundenVoice over IP

Bei der Telekom ist es seit einigen Tagen laut Aussage der Geschäftskunden-Hotline möglich, eine Rufnummernübernahme auch dann durchzuführen, wenn ...

Netzwerke
Riesiges Botnetz in Deutschland
Tipp von FFSephiroth vor 7 StundenNetzwerke1 Kommentar

Überprüft mal eure Router und NAS

Soziale Netzwerke

Freitag, der 25.05 - Facebook baut weltgrößtes P.ähm Antip.archiv der Welt auf

Information von certifiedit.net vor 8 StundenSoziale Netzwerke3 Kommentare

Guten Morgen, da fragt man sich doch allen ernstes, was Facebook damit bezwecken möchte, ich tippe ja darauf, dass ...

Heiß diskutierte Inhalte
HTML
Link nicht vollständig
Frage von jensgebkenHTML33 Kommentare

Hallo Gemeinschaft, ich erstelle mit Word einen Serienbrief, den ich per Mail versende. Nun mein Problem der Wordserienbrief holt ...

Datenschutz
E-Mail Verschlüsselung DSGVO 2018
gelöst Frage von SoccerdeluxDatenschutz33 Kommentare

Hallo zusammen, ich verzweifele langsam und wende mich an euch und hoffe vielleicht ein paar Antworten zu finden. Ich ...

Server-Hardware
HPE DL 360e GEN8 - P420 - Lüfter drehen auf nach Festplattenwechsel
Frage von maniacmacpainServer-Hardware20 Kommentare

Hallo, ich kenne den Effekt, dass man bei der GEN8 von HP ein Array eingerichtet haben muss, damit die ...

Server-Hardware
ILO4 auf HP DL20 Gen9 deaktivieren
Frage von it-fraggleServer-Hardware16 Kommentare

Hallo, es ist zum verrückt werden. Auf dem Server lässt sich iLO nicht abschalten. Das Problem hatte ich schon ...