helix2648
Goto Top

For Schleife mit der Variable im Dateinamen

Guten Morgen,

ich habe das unten genannte Problem und bekomme es nicht gelöst. Ich würde mich über einen Denkanstoß sehr freuen

Das Problem ist, dass ich eine Batch Datei schreiben möchte, die mir automatisch die ereignissanzeige komplett protokolliert und dann löscht.

Nun benötige ich ja variable Dateinamen für den Log und diesen möchte ich mit Hilfe der FOR Variable anlegen.

Beispiel:
@ECHO OFF
ECHO Protokolliere Ereignissanzeige-Protokoll...
FOR /F "USEBACKQ DELIMS=" %%l IN (`WEVTUTIL EL`) DO WEVTUTIL EPL "%%l" "C:\Ablage\Temp\Wevtutil\" && "%%l" && ".evtx"  
ECHO Loesche Ereignissanzeige-Protokoll...
FOR /F "USEBACKQ DELIMS=" %%l IN (`WEVTUTIL EL`) DO WEVTUTIL CL "%%l"  
@ECHO ON

Die Schleife soll also jeden Log-Type durchgehen und dann diesen mit dem entsprechenden Namen ablegen. Sprich, er archiviert den Log-Typ SYSTEM unter C:\Ablage\Temp\System.evtx".

Wie geht das?

Vielen lieben Dank!

Gruß,
Hleix

Content-ID: 165454

Url: https://administrator.de/forum/for-schleife-mit-der-variable-im-dateinamen-165454.html

Ausgedruckt am: 25.12.2024 um 07:12 Uhr

Skyemugen
Skyemugen 01.05.2011 um 10:18:00 Uhr
Goto Top
Aloha,

nun es scheint mir fast, als hättest du sonst mit VisualBasic zu tun *gg*
FOR /F "USEBACKQ DELIMS=" %%l IN (`WEVTUTIL EL`) DO WEVTUTIL EPL "%%l" "C:\Ablage\Temp\Wevtutil\%%l.evtx"
könnte dein Problem eventuell lösen ;)

mit deinen genutzen Befehlen kann ich sonst nichts anfangen, daher gehe ich davon aus, dass die sonstige Reihenfolge in der Abarbeitung korrekt sein wird, sollte dem nicht so sein ... dann wäre da noch Platz für einen Wurm der mir ohne Frühstück verborgen bleibt

oh noch etwas: was machen die accent graves dort in der Schleife? Das sollten doch eigentlich Apostrophe werden ... ?

greetz André

P.S.: alles nach && wird als zusätzlicher Befehl ausgeführt
99045
99045 01.05.2011 um 10:32:54 Uhr
Goto Top
Moin,

falscher Ansatz, daher gelöscht face-smile

Was dein Tool WEVTUtil anstellt, weiß wusste ich leider nicht, jetzt weiß ich es.

Gruß
Helix2648
Helix2648 01.05.2011 um 10:47:13 Uhr
Goto Top
Hallo zusammen,

vielen Dank erst einmal für die Antworten.

Bzgl. der Frage von Skyemugen: Die Accent Graves brauchst du, damit die FOR Schleife "wevtutil epl" als Befehl ausführt (usebackq). Aber leider funktioniert dein Tip nicht. Er meckert immer rum, dass er den Pfad nicht findet.

Also kurz mal generell zur Erklärung was ich vor habe... Das Tool wevtutil dient zum Verwalten der Ereignissanzeige auf Kommandozeilenebene. Der Befehl "wevtutil el" z.B. listet alle Channels auf, die protokolliert werden. Das heisst, dass ich mit der zweiten Schleife das Programm aufrufe und jeden Channel der Variable %l zuordne und dann mit "wevtutil cl [Variable]" lösche.

Wenn ich nun vorher den Channel sichern will, dann müsste ich z.B. den folgenden Befehl benutzen:

wevtutil epl SYSTEM C:Ablage\Temp\System.evtx

Da ich ja aber nun mit der Schleife alle Channels sichern möchte (jeweils eine Datei pro Channel) muss ich also den Dateinamen anhand der Variable definieren.

wevtutil epl [Variable] C:\Ablage\Temp\[Variable].evtx

Somit wäre der Ansatz von Kaputtnick (toller Name übrigens face-smile ) nicht notwendig.

Ich hoffe, dass ich das soweit verständlich rüber bringen konnte.
bastla
bastla 01.05.2011 um 11:56:34 Uhr
Goto Top
Hallo Helix2648!

Vielleicht solltest Du die Ausgabe von "wevtutil el" (einmal genauer betrachten und dann) etwas einschränken (dann natürlich auch in Zeile 5) - ungetestet:
FOR /F "DELIMS=" %%I IN ('WEVTUTIL EL^|FINDSTR /V "\/"') DO WEVTUTIL EPL "%%I" "C:\Ablage\Temp\Wevtutil\%%I.evtx"
Falls aber tatsächlich alle angeboteten Logs gespeichert werdem sollen, müssten die in den Namen enthaltenen "/" in etwas "Dateinamentauglicheres" face-wink umgewandelt werden.
BTW:
Die Accent Graves brauchst du, damit die FOR Schleife "wevtutil epl" als Befehl ausführt (usebackq).
... aber da Du hier "usebackq" nicht benötigst ...

Grüße
bastla

[Edit] "Escapen" von "/" nachgetragen und Anzahl der "'" auf 2 reduziert [/Edit]
Skyemugen
Skyemugen 01.05.2011 um 13:35:26 Uhr
Goto Top
Zitat von @Helix2648:
Die Accent Graves brauchst du, damit die FOR Schleife "wevtutil epl" als Befehl ausführt (usebackq).

Aloha,

ich seh schon: Vor dem Frühstück arbeitet mein Hirn nur auf Standby ... ich habe doch allen Ernstes usebackq völlig ausgeblendet beim Denken *pfeif* - Sonntagvormittag eben *gg*

greetz André
Friemler
Friemler 01.05.2011 um 13:59:40 Uhr
Goto Top
Hallo Helix2648,

wie bastla schon bemerkt hat, müssen die Namen der Event Channels, die das Zeichen / enthalten, angepasst werden, da Datei- und Verzeichnisnamen dieses Zeichen nicht enthalten dürfen. Hier mein Vorschlag, der das umsetzt:
@echo off

setlocal

set "OutputPath=C:\Ablage\Temp\Wevtutil"  


echo Protokolliere Ereignissanzeige-Protokoll...

for /f "delims=" %%l in ('wevtutil el') do (  
  call :ProcessChannel "%%l"  
)

echo Loesche Ereignissanzeige-Protokoll...

for /f "delims=" %%l in ('wevtutil el') do (  
  echo wevtutil cl "%%l"  
)

exit /b



:ProcessChannel
  set "Param=%~1"  
  set "SubChannel=%Param:*/=%"  
  call set "Channel=%%Param:/%SubChannel%=%%"  

  if "%SubChannel%" neq "" if "%SubChannel%" neq "%Channel%" (  
    echo md "%OutputPath%\%Channel%"  
    echo wevtutil epl "%~1" "%OutputPath%\%Channel%\%SubChannel%.evtx"  
  ) else (
    echo wevtutil epl "%~1" "%OutputPath%\%Channel%.evtx"  
  )
exit /b

Kurze Erläuterung:
Für jeden Channel, der das Zeichen / enthält, wird im Zielverzeichnis ein Unterverzeichnis erstellt. Der eigentliche Eventprotokoll-Export wird dann nach dem benannt, was nach dem / kommt.

Das ganze wird durch die Stringersetzungen in Zeile 26 und 27 erreicht. Zeile 26 schreibt in die Variable SubChannel alles, was hinter dem / kommt. Zeile 26 maskiert in der Variablen Param den Teil, der der Variablen SubChannel mit voranstehendem / entspricht und weist den Rest der Variablen Channel zu. Siehe dazu auch die Hilfe zum SET-Befehl.

Zeile 29 ist praktisch eine AND-Operation auf die zwei IF-Befehle.

Das ganze funktioniert nur, wenn, wie bei meinen Eventprotokollen, das Zeichen / nur einmal im Namen eines Channels vorkommt.

Die ECHO-Befehle in den Zeilen 17, 30, 31 und 33 dienen nur zur Ausgabe dessen, was passieren würde und müssen entfernt werden, damit das Script seinen Job macht.

Gruß
Friemler
bastla
bastla 01.05.2011 um 14:47:21 Uhr
Goto Top
@Friemler
Wenn wirklich sämtliche Logs gespeichert werden sollen, würde ich einfach "/" durch zB "_" ersetzen (dann spielt auch die Anzahl enthaltener "/" keine Rolle) und mir damit auch die Unterordner ersparen ...

Grüße
bastla