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

Batch & Shell

URL decodieren mittels Batch-Aufruf

gelöst Frage von GruenspechtBatch & Shell11 Kommentare

Habe aktuell ein Problem mit einer Batch-Datei unter DOS (CMD-Aufruf unter Win7/10): Ziel ist es, ein URL so umzuwandeln, ...

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

Neue Wissensbeiträge
Humor (lol)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 1 TagHumor (lol)2 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 2 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 5 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 6 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
SSD zeigt falsche Werte
Frage von karl2014Festplatten, SSD, Raid25 Kommentare

Ich habe ein Problem mit der SSD in meinem Laptop mit Windows 10. Es ist eine 1Tb Platte die ...

Grafikkarten & Monitore
PCIe 1.0 Grafikkarte für 3840x2160
Frage von Windows10GegnerGrafikkarten & Monitore24 Kommentare

Hallo, mein Vater hat einen neuen Monitor gekauft, welcher eine native Auflösung von 3840*2160 hat. Diese muss jetzt auch ...

Windows 10
Windows Enterprise 1809 Eval nicht bootbar
Frage von Sunny89Windows 1022 Kommentare

Hallo zusammen, bevor ich mich jetzt noch stundenlang rumärger wollte ich euch fragen, ob Ihr die gleichen Probleme habt ...

Ubuntu
Installation freerdp 2.0.0-rc4
Frage von kristovUbuntu20 Kommentare

Hallo, möchte freerdp 2.0.0-rc4 auf linux mint 18.3 installieren, habe aber keine Ahnung, wie das funktioniert. freerdp 1.1 ist ...