Mit Powershell aus dem Eventlog den Messageinhalt in Excel schreiben
Hallo Zusammen,
ich versuche aus dem System-Eventlog bestimmte Informationen in eine csv-Datei zu schreiben.
Beispiel :get-eventlog -newest 5 -logname application |where {$_.source -eq "AutoEnrollment"} | select-object * | % ($Message = $_.Message)
Nun möchte ich die "Messages" dieser Fehlermeldungen in je >eine< Zelle einer csv schreiben.
Bei längeren Meldungen wird das leider immer in mehrere Zellen geschrieben.
Danke!
ich versuche aus dem System-Eventlog bestimmte Informationen in eine csv-Datei zu schreiben.
Beispiel :get-eventlog -newest 5 -logname application |where {$_.source -eq "AutoEnrollment"} | select-object * | % ($Message = $_.Message)
Nun möchte ich die "Messages" dieser Fehlermeldungen in je >eine< Zelle einer csv schreiben.
Bei längeren Meldungen wird das leider immer in mehrere Zellen geschrieben.
Danke!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 118703
Url: https://administrator.de/forum/mit-powershell-aus-dem-eventlog-den-messageinhalt-in-excel-schreiben-118703.html
Ausgedruckt am: 18.05.2025 um 12:05 Uhr
18 Kommentare
Neuester Kommentar

Hallo Feuerstein08,
warum nicht einfacher:
Die Bildschirmausgabe weicht ja immer ab, wie schreibst du in die Datei?
Ich habe hier keine AutoEnrollment Einträge, wie sehen die Messsages denn aus?
Wenn die Zeilenwechsel Bestandteil der Messages sind, musst du sie gfs. rausfiltern.
Wenn in den Messages Anführungszeichen enthalten sind, müssen die auch ggfs ersetz/escaped werden damit eine gültige csv entsteht.
Gruß
LotPings
warum nicht einfacher:
get-eventlog -newest 5 -logname application -source AutoEnrollment | select-object Message
Die Bildschirmausgabe weicht ja immer ab, wie schreibst du in die Datei?
Ich habe hier keine AutoEnrollment Einträge, wie sehen die Messsages denn aus?
Wenn die Zeilenwechsel Bestandteil der Messages sind, musst du sie gfs. rausfiltern.
Wenn in den Messages Anführungszeichen enthalten sind, müssen die auch ggfs ersetz/escaped werden damit eine gültige csv entsteht.
Gruß
LotPings

Zitat von @Feuerstein08:
Könnte es an Steuerzeichen in der Message liegen (CRLF) und wenn "Ja" : wie bekomme ich das entsprechend hin?
JA.Könnte es an Steuerzeichen in der Message liegen (CRLF) und wenn "Ja" : wie bekomme ich das entsprechend hin?
Mit einer berechneten Eigenschaft die Message um das CRLF erleichtern:
get-eventlog -logname system -newest 5| Select Index,EventID,MachineName,Category,CategoryNumber,EntryType,@{Name="MyMSG"; Expression = {$_.Message -replace "`r`n", ""}},Source | export-csv "c:\test\test.csv"
Gruß
LotPings

Zitat von @Feuerstein08:
Könntest du mir noch kurz erläutern, was es mit dem "@" auf sich hat? Ist das eine Powershell interne Variable (foreach?)
Siehe Könntest du mir noch kurz erläutern, was es mit dem "@" auf sich hat? Ist das eine Powershell interne Variable (foreach?)
get-help select -full
und
get-help export-csv -full
Das ist eine berechnete Eigenschaft. In Powershell bin ich auch noch ein "Einäugiger" und muss viel googlen bzw. in der Newsgroup "microsoft.public.windows.powershell" mitlesen.
Kannst du mir ein Tutorial oder eine gute Seite nennen, wo ich das mit den internen Variablen und die Handhabung mit den Expressions nachlesen kann? (Möchte ja schlauer werden 
Da ich mir mein Wissen nur Online angeeignet habe, kann ich kein Buch empfehlen, ich such mal bei Gelegenheit Links raus.Und zu guter letzt, wie kann ich diese Ausgabe so umformulieren, das ich anstatt der Komma-Trennung die Tabulatoren >`t< reinbekomme?
get-eventlog -logname system -newest 5| Select Index,EventID,MachineName,Category,CategoryNumber,EntryType,@{Name="MyMSG"; Expression = {$_.Message -replace "`r`n", ""}},Source | export-csv "c:\test\test.csv" -delimiter "`t"
Dann reicht ein einfacher Doppelklich auf die csv-Datei - so hat Excel beim öffnen immer ein wenig Probleme damit (oder mache ich hier auch etwas falsch?).
Excel sollte mit dem Standard csv Format eigentlich auch klarkommen.Gruß
LotPings

Zitat von @Feuerstein08:
... und wie bekomme ich Datum und Zeit da noch rein. Einfach simpel
Date und Time haben nicht hingehauen ... ??
Tja welche DateTime?... und wie bekomme ich Datum und Zeit da noch rein. Einfach simpel
Date und Time haben nicht hingehauen ... ??
Schau dir mal dies an:
get-eventlog -logname system -newest 1| gm
Da gibts es
"TimeGenerated" und "TimeWritten"
Hier nochmal alles zusammen:
get-eventlog -logname system -newest 5| Select TimeGenerated,TimeWritten,Index,EventID,MachineName,Category,CategoryNumber,EntryType,@{Name="MyMSG"; Expression = {$_.Message -replace "`r`n", ""}},Source | export-csv "c:\test\test.csv" -delimiter "`t"
Gruß

Zitat von @Feuerstein08:
OK - der Delimiter scheint erst ab der V2 zu funktionieren. Ich habe (und muss leider) die V1 benutzen.
Schade, hab hier überall v2, entweder ctp3 oder schon dabei.OK - der Delimiter scheint erst ab der V2 zu funktionieren. Ich habe (und muss leider) die V1 benutzen.
Hast du noch einen Workaround für mich und der Tabulatorgeschichte?
Speicher mal mit export-csv mit der Erweiterung .txt - dann müsste der ImportDialog von excel kommen.Alternativ
- hab ich im Hinterkopf dass man auch xls erzeugen kann, habe ich aber gerade nicht greifbar
- in der Datei Suchen nach "," ersetzen mit "`t".
Habe gerade nicht soviel Zeit.
Gruß

Dies sollte auch mit v1 gehen:
Gruß
$str = get-eventlog -logname system -newest 5| Select TimeGenerated,TimeWritten,Index,EventID,MachineName,Category,CategoryNumber,EntryType,@{Name="MyMSG"; Expression = {$_.Message -replace "`r`n", ""}},Source | ConvertTo-Csv -NoTypeInformation
$str = $str -replace ",", "`t"
$str |out-file -filepath "c:\test\test.csv"
Gruß

Hallo Feuerstein08,
das war auch für mich eine Nuss
Die Lösung ist die Kommandozeile in einem String zusammenzubauen und dann mit invoke-expression auszuführen.
Dieses Script erzeugt bei mir identischen Output für beide Varianten.
Ob das auch unter V1 geht, musst du selber testen.
Ich habe auch noch ein paar Dinge geändert, Header in Variable, unsinningen
Gruß
LotPings
das war auch für mich eine Nuss
Die Lösung ist die Kommandozeile in einem String zusammenzubauen und dann mit invoke-expression auszuführen.
Dieses Script erzeugt bei mir identischen Output für beide Varianten.
Ob das auch unter V1 geht, musst du selber testen.
Ich habe auch noch ein paar Dinge geändert, Header in Variable, unsinningen
Select-Object *
entfernt, MyMsg in Message geändert (man kann Eigenschaften überschreiben)if ((Test-Path "D:\Test\Posh") -ne $true)
{new-item -path c:\ -name test -type directory}
$csv_file_1 = "D:\Test\Posh\Eventlog1.csv"
$csv_file_2 = "D:\Test\Posh\Eventlog2.csv"
$IDToQuery =@()
$IDToQuery = "4","9"
Write-Host ""
Write-Host IDToQuery = $IDToQuery :: Anzahl = $IDToQuery.Count
#########################################
# Query erstellen #
#########################################
$query = ""
If ($IDToQuery.Count -gt 0)
{$query = '(($_.EventID -eq 4) -or ($_.EventID -eq 9))'}
# ... hier würden noch weitere Array Abfragen kommen
# dadurch erweitert sich die <query>
Write-Host Query = $query
####################
# Header erstellen #
####################
$Header = "Computer`tEventID`tTimeGenerated`tMachineName`tCategoryNumber`tEntryType`tSource`tMessage"
$Header | out-file -filepath $csv_file_1
$Header | out-file -filepath $csv_file_2
#######################
# Eigentliche Abfrage #
#######################
# So möchte ich die Query gestalten (und ausbauen) - erhalte aber leider das komplette Log ...
$cmd='get-eventlog -logname system | where-object {' + $query + '}| Select Index,EventID,TimeGenerated,MachineName,CategoryNumber,EntryType,Source,@{Name="Message";Expression={$_.Message -replace "`r`n", ""}}| %{$EventID=$_.EventID; $MachineName=$_.MachineName; $TimeGenerated=$_.TimeGenerated; $CategoryNumber=$_.CategoryNumber; $EntryType=$_.EntryType; $Message=$_.Message; $Source=$_.Source;"$CompName`t$EventID`t$TimeGenerated`t$MachineName`t$CategoryNumber`t$EntryType`t$Source`t$Message"}| out-file -filepath $csv_file_1 -Append'
Invoke-Expression $cmd
# richtiger Output, aber ich will ja die Bedingungen nicht einzeln reinschreiben, sondern flexibel gestalten
get-eventlog -logname system | where-object {(($_.EventID -eq 4) -or ($_.EventID -eq 9))} `
| Select Index,EventID,TimeGenerated,MachineName,CategoryNumber,EntryType,Source,@{Name="Message";Expression={$_.Message -replace "`r`n", ""}} `
| %{$EventID=$_.EventID; $MachineName=$_.MachineName; $TimeGenerated=$_.TimeGenerated; $CategoryNumber=$_.CategoryNumber; $EntryType=$_.EntryType; $Message=$_.Message; $Source=$_.Source; `
"$CompName`t$EventID`t$TimeGenerated`t$MachineName`t$CategoryNumber`t$EntryType`t$Source`t$Message"} `
| out-file -filepath $csv_file_2 -Append
Gruß
LotPings

Sorry Feuerstein08,
aber so geht das nicht.
Die eigentliche Frage ist längst beantwortet und das solltest du auch entsprechend abhaken. Desen Beitrag als "gelöst" markieren
Deine Ergänzungen habe ich alleine austüfteln müssen weil Andere diese Fragen in diesem alten Thread gar nicht beachten (können).
Also mache bitte für die neuen Fragen einen neuen Beitrag auf.
Gruß
LotPings
aber so geht das nicht.
Die eigentliche Frage ist längst beantwortet und das solltest du auch entsprechend abhaken. Desen Beitrag als "gelöst" markieren
Deine Ergänzungen habe ich alleine austüfteln müssen weil Andere diese Fragen in diesem alten Thread gar nicht beachten (können).
Also mache bitte für die neuen Fragen einen neuen Beitrag auf.
Gruß
LotPings