Bestimme Logfiles kopieren, entpacken via Batch-Datei
Hallo,
mit Hilfe der Suche bin ich leider auf keinen Lösungsansatz gestossen.
EINLEITUNG:
In Einem Firmennetzwerk werden von bestimmten Clients Logfiles angelegt. Diese werden auf den Server unter dem festgelegten Ordner des Clients gespeichert. In diesem Clientordner habe ich 2 Ordner in dem sich die Logfiles in gepackter Form befinden. Einmal den Hauptordner und einen Ablageordner. Im Hauptordner befinden sich die Logfiles der letzten 7 Tage. Logfiles die älter als 7 Tage sind, werden automatisch in den Überordner "Ablage" verschoben. Die Logfiles werden täglich angelegt und besitzen z.B. den Dateinamen "20081013_logfile.txt.zip"
PROBLEM:
Ich suche eine Möglichkeit, so dass ich Logfiles eines bestimmten Zeitraums z.B. von 01.10.-10.10.2008 anhand des Dateinamens in ein bestimmtes Verzeichnis kopieren kann und darauffolgend diese entpackt und die Zip-Dateien löscht, so dass ich nur noch in diesen gesammelten Verzeichnis der Clients die txt-Dateien vorliegen habe um eine Auswertung der Logfiles mehrerer Clients von einem bestimmten Zeitraum vornehmen zu können.
Für jeden Lösungsansatz bin ich sehr Dankbar!
mit Hilfe der Suche bin ich leider auf keinen Lösungsansatz gestossen.
EINLEITUNG:
In Einem Firmennetzwerk werden von bestimmten Clients Logfiles angelegt. Diese werden auf den Server unter dem festgelegten Ordner des Clients gespeichert. In diesem Clientordner habe ich 2 Ordner in dem sich die Logfiles in gepackter Form befinden. Einmal den Hauptordner und einen Ablageordner. Im Hauptordner befinden sich die Logfiles der letzten 7 Tage. Logfiles die älter als 7 Tage sind, werden automatisch in den Überordner "Ablage" verschoben. Die Logfiles werden täglich angelegt und besitzen z.B. den Dateinamen "20081013_logfile.txt.zip"
PROBLEM:
Ich suche eine Möglichkeit, so dass ich Logfiles eines bestimmten Zeitraums z.B. von 01.10.-10.10.2008 anhand des Dateinamens in ein bestimmtes Verzeichnis kopieren kann und darauffolgend diese entpackt und die Zip-Dateien löscht, so dass ich nur noch in diesen gesammelten Verzeichnis der Clients die txt-Dateien vorliegen habe um eine Auswertung der Logfiles mehrerer Clients von einem bestimmten Zeitraum vornehmen zu können.
Für jeden Lösungsansatz bin ich sehr Dankbar!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 99104
Url: https://administrator.de/contentid/99104
Ausgedruckt am: 05.11.2024 um 19:11 Uhr
22 Kommentare
Neuester Kommentar
Hallo Attituder!
So ganz klar ist mir die Struktur nicht - einerseits sollen sich "Hauptordner" und "Ablageordner" im "Clientordner" befinden, andererseits bezeichnest Du den "Ablageordner" als Überordner ... (Ich nehme einmal an, dass sich beide Ordner unterhalb des "Clientordners" befinden.)
Soferne das "bestimmte Verzeichnis" (in welches die Logs entpackt werden sollen) das Ziel für alle Logs aus dem angegebenen Zeitraum sein soll, wäre noch zu klären, wie ein Überschreiben der Logs eines vorher behandelten Clients vermieden werden kann. Eine Möglichkeit wäre, den Namen des "Clientordners" an den Dateinamen anzufügen (siehe Batch).
Da Du kein (Ent-)Packprogramm erwähnt hast, verwende ich zum Testen "7za.exe", die Standalone-Commandline-Version von "7-zip" (Download) mit dem Speicherort "C:\Scripts".
Auf Basis der getroffenen Annahmen könnte der Batch dann so aussehen:
Der Sammelordner wird, falls noch nicht vorhanden, erstellt und jeweils beim Start gelöscht.
Grüße
bastla
So ganz klar ist mir die Struktur nicht - einerseits sollen sich "Hauptordner" und "Ablageordner" im "Clientordner" befinden, andererseits bezeichnest Du den "Ablageordner" als Überordner ... (Ich nehme einmal an, dass sich beide Ordner unterhalb des "Clientordners" befinden.)
Soferne das "bestimmte Verzeichnis" (in welches die Logs entpackt werden sollen) das Ziel für alle Logs aus dem angegebenen Zeitraum sein soll, wäre noch zu klären, wie ein Überschreiben der Logs eines vorher behandelten Clients vermieden werden kann. Eine Möglichkeit wäre, den Namen des "Clientordners" an den Dateinamen anzufügen (siehe Batch).
Da Du kein (Ent-)Packprogramm erwähnt hast, verwende ich zum Testen "7za.exe", die Standalone-Commandline-Version von "7-zip" (Download) mit dem Speicherort "C:\Scripts".
Auf Basis der getroffenen Annahmen könnte der Batch dann so aussehen:
@echo off & setlocal
set "Von=20081001"
set "Bis=20081010"
set "Postfix=_logfile.txt.zip"
set "Basis=D:\Logs"
set "Sammel=D:\SelectedLogs"
set "UnZIP=C:\Scripts\7za.exe"
if not exist "%Sammel%" md "%Sammel%"
del /q "%Sammel%"
for /d %%v in ("%Basis%\*.*") do (
echo Bearbeite Client: %%v
for /f %%i in ('dir /s /b /a-d "%%v\20??????%Postfix%" 2^>nul') do (
echo Pruefe Log: %%~ni
if "%%~nxi" geq "%Von%%PostFix%" if "%%~nxi" leq "%Bis%%PostFix%" (
echo #Entpacke Log: %%~ni
"%UnZIP%" e -y "%%i" -o"%Sammel%" >nul
if exist "%Sammel%\%%~ni" for /f %%a in ("%%~ni") do ren "%Sammel%\%%~ni" %%~na-%%~nxv%%~xa"
)
)
)
Grüße
bastla
Moin Attituder,
bei diesem Sonntags-Problem würde ich mich gar nicht lange über die Unzulänglichkeiten von M$-Batchen oder die Unfähigkeit der Redmonder PraktikantInnen ärgern, sondern das unaufwändig wie folgt lösen:
Statt F:\FesterFad natürlich den Pfad, unter dem Deine Sonntage-Datei liegt.
Gratis-Zusatzfeature: Außer Sonntagen kannst Du dort auch Weihnachten, Vinxten und Merkels Geburtstag eintragen, also alle Tage, an denen nicht gearbeitet wird.
[ Anmerkung: Eventuell ist es einfacher, nur die Tage einzutragen, an denen gearbeitet wird...
P.S. Und falls bastla Dir da lieber eine VBS-Lösung anschnacken will: einfach ignorieren *g
Grüße
Biber
bei diesem Sonntags-Problem würde ich mich gar nicht lange über die Unzulänglichkeiten von M$-Batchen oder die Unfähigkeit der Redmonder PraktikantInnen ärgern, sondern das unaufwändig wie folgt lösen:
- lege Dir eine Textdatei "Sonntage.txt" mit den Sonntagsdatumswerten im ANSI-Format (yyyymmdd) an (Zeitbedarf dafür 3 Minuten):
.....
20081005
20081012
20081019
20081026
....
- bastla hat irgendwo eine kryptische IF-Bedingung "[if "%%~nxi" geq "%Von%%PostFix%"....]
- vor dieses IF-Konstrukt in dieselbe Zeile noch
find "%%~nxi" F:\FesterFad\Sonntage.txt>nul || [IF-bedingung gemäß bastla...]
Statt F:\FesterFad natürlich den Pfad, unter dem Deine Sonntage-Datei liegt.
Gratis-Zusatzfeature: Außer Sonntagen kannst Du dort auch Weihnachten, Vinxten und Merkels Geburtstag eintragen, also alle Tage, an denen nicht gearbeitet wird.
[ Anmerkung: Eventuell ist es einfacher, nur die Tage einzutragen, an denen gearbeitet wird...
P.S. Und falls bastla Dir da lieber eine VBS-Lösung anschnacken will: einfach ignorieren *g
Grüße
Biber
@Biber
Grüße
bastla
... falls bastla Dir da lieber eine VBS-Lösung anschnacken will ...
Wie kommst Du denn auf derart Abwegiges? Grüße
bastla
@bastla
Grüße
Biber
Wie kommst Du denn auf derart Abwegiges?
Man/frau weiss ja nie, was so im Kopf eines Skripters vorgeht... Grüße
Biber
@Biber
Würdest Du übrigens Batcher unter Skripter subsumieren?
Grüße
bastla
Man/frau weiss ja nie, was so im Kopf eines Skripters vorgeht...
Ist wohl auch besser so ...Würdest Du übrigens Batcher unter Skripter subsumieren?
Grüße
bastla
Aber dazu müsste ich doch alle Arbeitstage in eine extra txt-Datei eintragen, oder?
Jepp, und die Sinnhaftigkeit ist abhängig davon, ob in den 365 Tagen eines Jahres mehr als die Hälfte Arbeitstage oder Nicht-Arbeitstage sind.Wenn es nur um 52 Sonntage und 20 Feiertage pro Jahr geht
--> dann sind sind freie Tage mit 72 von 365 eindeutig die Ausnahme (so genannte Arbeitnehmer-Sicht).
[ Aus Arbeitgeber-Sicht würde allerdings sicherlich nahegelegt werden, mal eben nur die paar Arbeitstage einzutragen - die meiste Zeit hast Du ja eh frei.
[365 Tage a 24 Stunden hat das Jahr, davon werden nur 8 Stunden, also ein Drittel gearbeitet.
--> Netto also ca 365/3 = 122 Tage AUFgerundet.
Abzüglich 52 Sonntage --> bleiben 70 Tage
Abzüglich 20 gesetzliche Feiertage --> bleiben 50 Tage.
Abzüglich 30 Tage Urlaub --> bleiben 20 Tage.
Abzüglich 3 Tage frei für Umzug, Beerdigungen, Hochzeit und sonstige Vergnügungen-> bleiben 17 Tage.
Abzüglich 10 Tage für Schulung und Fortbildung. --> bleiben 7 Tage.
Und die 7 Arbeitstage kannst Du doch eben mal in der Mittagspause in so eine Textdatei eintippseln, oder nicht?]
Grüße
Biber
Zitat von @Attituder:
Habe das gerade mit den Sonntage.txt ausprobiert. Nur leider
funktioniert das irgendwie nicht .
Habe das gerade mit den Sonntage.txt ausprobiert. Nur leider
funktioniert das irgendwie nicht .
Hmm, könnte mit diesen Sonnenflecken zusammenhängen...
Oder vielleicht zu feiner Sand...?
Evtl. kann ich genauer raten, wenn ich das jetzige Skript sehe..
Mir ist noch ein zusätzliches Feature eingefallen was sicherlich
zu lösen ist. Die Zeitspanne, die ich in der Batch-Datei angeben
kann ist es doch sicherlich auch möglich diese Zeitspanne in eine
externe-Datei reinzuschreiben, die dann wieder von dieser Batch-Datei
ausgelesen wird?
Dazu die beiden Zeilenzu lösen ist. Die Zeitspanne, die ich in der Batch-Datei angeben
kann ist es doch sicherlich auch möglich diese Zeitspanne in eine
externe-Datei reinzuschreiben, die dann wieder von dieser Batch-Datei
ausgelesen wird?
Von=20081001
Bis=20081010
For /f "delims=" %%i in (LogFileunzip.ini) do Set "%%i"
Grüße
Biber
Hallo Attituder!
Da in der "Sonntagsliste" nur das Datum, im Dateinamen aber auch noch der Zusatz "_logfile.txt.zip" enthalten ist, muss der Name zunächst noch zerlegt werden:
Bei dieser Gelegenheit habe ich auch gleich Variablen für die beiden Dateien "LogFileunzip.ini" (diesen Pfad musst Du noch anpassen) und "Sonntage.txt" verwendet - macht's etwas änderungsfreundlicher.
Grüße
bastla
P.S.: Bitte verwende in Zukunft für das Posten von Batches entsprechende .
Da in der "Sonntagsliste" nur das Datum, im Dateinamen aber auch noch der Zusatz "_logfile.txt.zip" enthalten ist, muss der Name zunächst noch zerlegt werden:
@echo off & setlocal
set "Ini=I:\Logfiles\LogFileunzip.ini"
set "Basis=I:\Logfiles"
set "Sammel=I:\SelectedLogs"
set "Postfix=_logfile.txt.zip"
set "UnZIP=I:\batch\7za.exe"
set "Sonntage=I:\batch\Sonntage.txt"
For /f "usebackq delims=" %%i in ("%Ini%") do Set "%%i"
if not exist "%Sammel%" md "%Sammel%"
del /q "%Sammel%"
for /d %%v in ("%Basis%\*.*") do (
echo Bearbeite Client: %%v
for /f %%i in ('dir /s /b /a-d "%%v\20??????%Postfix%" 2^>nul') do (
echo Pruefe Log: %%~ni
for /f "delims=_" %%d in ("%%~nxi") do find "%%d" "%Sonntage%">nul || if "%%~nxi" geq "%Von%%PostFix%" if "%%~nxi" leq "%Bis%%PostFix%" (
echo #Entpacke Log: %%~ni
"%UnZIP%" e -y "%%i" -o"%Sammel%" >nul
if exist "%Sammel%\%%~ni" for /f %%a in ("%%~ni") do ren "%Sammel%\%%~ni" %%~na-%%~nxv%%~xa"
)
)
)
Grüße
bastla
P.S.: Bitte verwende in Zukunft für das Posten von Batches entsprechende .
Hallo Attituder!
Zum Aufteilen der einzelnen Client-Logs in die entsprechenden Ordner benötigst Du eine Zuordnung (sinnvoller Weise wieder als Textdatei, zB "Abteilungen.txt") zwischen Client und Abteilung, also etwa
<code type=plain">
PC01:Grafik
PC02:Grafik
PC03:Buchhaltung
...
Der "Entpack- und Verteil-"Batch könnte dann so aussehen:
Der vormalige Ordner %Sammel% ist hier ersetzt durch den Ordner %AbtBasis%, wobei dieser Ordner zunächst entfernt (um alte Werte zu eliminieren) und dann durch das Entpacken bei Bedarf automatisch für jede Abteilung neu erstellt wird.
Grüße
bastla
Zum Aufteilen der einzelnen Client-Logs in die entsprechenden Ordner benötigst Du eine Zuordnung (sinnvoller Weise wieder als Textdatei, zB "Abteilungen.txt") zwischen Client und Abteilung, also etwa
<code type=plain">
PC01:Grafik
PC02:Grafik
PC03:Buchhaltung
...
Der "Entpack- und Verteil-"Batch könnte dann so aussehen:
@echo off & setlocal
set "Ini=I:\Logfiles\LogFileunzip.ini"
set "Basis=I:\Logfiles"
set "Postfix=_Logfiles_*.txt.zip"
set "AbtBasis=I:\LogsAbteilungen"
set "UnZIP=I:\batch\7za.exe"
set "Sonntage=I:\batch\Sonntage.txt"
set "Abteilungen=I:\batch\Abteilungen.txt"
for /f "usebackq delims=" %%i in ("%Ini%") do Set "%%i"
if exist "%AbtBasis%" rd /s /q "%AbtBasis%"
for /d %%v in ("%Basis%\*.*") do (
echo Bearbeite Client: %%~nxv
for /f %%i in ('dir /s /b /a-d "%%v\20??????%Postfix%" 2^>nul') do (
echo Pruefe Log: %%~ni
for /f "tokens=1,3 delims=_." %%d in ("%%~nxi") do (
find "%%d" "%Sonntage%">nul || if "%%d" geq "%Von%" if "%%d" leq "%Bis%" (
echo Gefunden Log: %%d_%%e
for /f "tokens=2 delims=:" %%a in ('findstr /i "%%e:" "%Abteilungen%"') do (
echo #Entpacke nach: %%a
"%UnZIP%" e -y "%%i" -o"%AbtBasis%\%%a" >nul
)
)
)
)
)
Ich bin nur noch nicht auf eine Lösung gekommen, diese Result.txt in den verschiedenen Abteilungsordnern zu einer txt-Datei zusammenzufassen um somit ein Endresultat aller Abteilungen zu erhalten.
Wenn tatsächlich alle "Result.txt" in eine Datei sollen, lässt sich das relativ einfach realisieren:@echo off & setlocal
set "AbtBasis=I:\LogsAbteilungen"
set "Einzel=Result.txt"
set "Gesamt=I:\LogsAbteilungen\Gesamt.txt"
if exist "%Gesamt%" del "%Gesamt%"
for /f "delims=" %%i in ('dir /s /b /a-d "%AbtBasis%\%Einzel%"') do type "%%i">>"%Gesamt%
Desweiteren wurde hier das Problem mit den Sonntagen mit einer Ini-File gelöst. Diese Lösung hätte ich auch gerne in meiner Auswertungs-Batch-File, so dass ich in der Ini-File angeben kann, nach welchem Suchbegriff er die Logfiles auslesen soll.
Dazu wäre es sinnvoll, zunächst den Auswertungs-Batch zu posten.Grüße
bastla
@Attituder & bastla
Könntest Du, @Attituder, Dich dieser Aufgabe bei Gelegenheit annehmen?
Ich empfinde jedenfalls diese Batch-Lösung als echtes Praxis-Beispiel eine Bereicherung für dieses Forum.
Grüße
Biber
Dazu wäre es sinnvoll, zunächst den Auswertungs-Batch zu posten.
Noch sinnvoller wäre es danach, Dein (fast) gelöstes Problem und die sich abzeichnende Musterlösung nochmals -bereinigt um ein paar Herantastversuche in diesem Thread- als Tutorial im Bereich "Batch & Shell" bereitzustellen.Könntest Du, @Attituder, Dich dieser Aufgabe bei Gelegenheit annehmen?
Ich empfinde jedenfalls diese Batch-Lösung als echtes Praxis-Beispiel eine Bereicherung für dieses Forum.
Grüße
Biber
Hallo Attituder!
Soferne ich das richtig interpretiere, zählt Dein Batch die Anzahl der Vorkommen von "SUCHBEGRIFF" im Zeitraum 08:00:00 bis 19:59:59 innerhalb aller .txt-Dateien und schreibt das Ergebnis in "result.txt".
Etwas knapper (und mit leicht veränderter Ergebnisdarstellung) ließe sich das etwa so formulieren:
Ganz klar ist mir allerdings noch nicht, welches Ziel Du genau anstrebst. Soll in jedem Abteilungsunterordner eine "result.txt" erstellt werden, oder möchtest Du alle Anzahlen in einer einzigen Datei zusammenfasssen?
Grüße
bastla
Soferne ich das richtig interpretiere, zählt Dein Batch die Anzahl der Vorkommen von "SUCHBEGRIFF" im Zeitraum 08:00:00 bis 19:59:59 innerhalb aller .txt-Dateien und schreibt das Ergebnis in "result.txt".
Etwas knapper (und mit leicht veränderter Ergebnisdarstellung) ließe sich das etwa so formulieren:
@echo off & setlocal
set "search=SUCHBEGRIFF"
set T=Daten
if exist %T% del %T%
for %%i in (08 09 10 11 12 13 14 15 16 17 18 19) do findstr /c:" %%i:" *.txt>>%T%
for /f "tokens=2 delims=:" %%i in ('find /c "%search%" %T%') do >RESULT.txt echo %search%:%%i
result.txt
del %T%
Grüße
bastla
Hallo Attituder!
Da ich noch immer nicht genau weiß, ob nun die einzelnen "result.txt" in den Abteilungsordnern erwünscht sind oder nicht, erstellt der folgende Batch sowohl diese Dateien als auch eine Datei mit der Zusammenfassung der Einzelergebnisse:
Die letzte Zeile dient der sofortigen Anzeige des Ergebnisses im Editor und kann natürlich ersatzlos gestrichen werden.
Um den Suchbegriff einer Datei entnehmen zu können, kannst Du die Zeile
auf
ändern.
Grüße
bastla
Da ich noch immer nicht genau weiß, ob nun die einzelnen "result.txt" in den Abteilungsordnern erwünscht sind oder nicht, erstellt der folgende Batch sowohl diese Dateien als auch eine Datei mit der Zusammenfassung der Einzelergebnisse:
@echo off & setlocal
set "search=SUCHBEGRIFF"
set "AbtBasis=I:\LogsAbteilungen"
set "Gesamt=I:\LogsAbteilungen\Gesamt.txt"
set "Einzel=Result.txt"
set "T=Daten.tmp"
if exist "%Gesamt%" del "%Gesamt%"
for /d %%v in ("%AbtBasis%\*.*") do (
pushd "%%v"
if exist "%T%" del "%T%"
if exist "%Einzel%" del "%Einzel%"
for %%i in (08 09 10 11 12 13 14 15 16 17 18 19) do findstr /c:" %%i:" *.txt>>"%T%"
for /f "tokens=2 delims=:" %%i in ('find /c "%search%" "%T%"') do (
>"%Einzel%" echo %search%:%%i
>>"%Gesamt%" echo %%~nxv:%%i
)
del "%T%"
)
popd
"%Gesamt%"
Um den Suchbegriff einer Datei entnehmen zu können, kannst Du die Zeile
set "search=SUCHBEGRIFF"
set /p search=<"I:\AbteilungsLogs\Suchbegriff.txt"
Grüße
bastla