mario80 10 Geschrieben 18. November 2012 Melden Teilen Geschrieben 18. November 2012 Hallo zusammen, bin neu in der Powershell Welt denke Script ist ganz simpel aber ich komme aus mangelden Kenntnissen einfach nicht weiter, folgende Herausforderung: Ich habe ein Ordner "C:\Logfiles" inhalt von dem Ordner siehr folgendermaßen aus Server001-perfmon.txt Server002-perfmon.txt Server003-perfmon.txt Jede .txt enthält folgenden Inhalt: _________________________________________________________________ ## Memory-Counter 90% GBL_MEM_UTIL wurde entfernt ## S;GBL_MEM_UTIL;;>;90;1-5;06:00;21:00;00:10;critical;OS;Phys. ## # zu Ueberwachenden Performance Kennwerte S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys S;GBL_CPU_TOTAL_UTIL;;>;90;1-5;06:00;21:00;00:30;warning;OS; _________________________________________________________________ Ich muss jede .txt auslesen und nur Einträge die mit "S" anfangen rausfiltern und nicht die Einträge mit "#", das ganze dann in eine .csv ausgeben! Schwierigkeit daran ist Servernamen "Server001-perfmon.txt" raus zu lesen und zu den Einträgen mit "S" zuzuordnen natürlich aus der richtigen .txt. Ergebnis sollte folgender maßen aussehen: _________________________________________________________________ Server001;S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys Server001;S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys Server001;S;GBL_CPU_TOTAL_UTIL;;>;90;15;06:00;21:00;00:30;warning;OS; Server002;S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys Server002;S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys Server002;S;GBL_CPU_TOTAL_UTIL;;>;90;15;06:00;21:00;00:30;warning;OS; Server003;S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys Server003;S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys Server003;S;GBL_CPU_TOTAL_UTIL;;>;90;15;06:00;21:00;00:30;warning;OS; _________________________________________________________________ Ich bekomme mit meinem Script Daten aus .txt rausgefiltert allerdings weiß ich nicht wie ich die Servernamen zu den ausgelesenen Daten zuorde das ich auch weiß zu welchem Server diese Einträge gehören. -------------------------------------------------------------------------- $filepath="C:\Logfiles" $file="C:\Logfiles\perfmon.csv" Get-ChildItem $filepath | Get-Content | Select-String -notmatch "#" | Out-File $file -------------------------------------------------------------------------- Kann mir jemand bitte helfen, Danke. Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 18. November 2012 Melden Teilen Geschrieben 18. November 2012 Ich würde das mit 2 Schleifen machen. In der ersten liest du die ganzen Dateien aus und bekommst z.B. mit .split() oder .substring() (in Kombination mit .indexof() um den Servernamen vom '-perfmon.txt' zu trennen). In der 2. Schleife (diese in der ersten Schleife) gehst du in jede Datei und ließt dort die Zeilen aus und bearbeitest diese und schreibst das in eine neue Datei. Siehst dann ungefähr so aus (aus dem Stegreif heraus gecodet und ungetestet): foreach($file in (get-childitem ....)){ $server = $file.name.split('-')[0] foreach($line in (get-content $file.FullName)){ if($line -like '#*'){ $server + ';' + $line | out-file ... -append } } } Zitieren Link zu diesem Kommentar
mario80 10 Geschrieben 18. November 2012 Autor Melden Teilen Geschrieben 18. November 2012 Perfekt Danke Funktioniert :) ich hab nach Einträgen mit "S" gesucht habs abgeändert und funktioniert sieht folgendermaßen aus: cls $filepath=Get-ChildItem "C:\Logs" $ausgabe="C:\TMP\datei.csv" foreach($file in $filepath){ $server = $file.name.split('-')[0] foreach($line in (get-content $file.FullName)){ if($line -like 'S*'){ $server + ';' + $line| Out-File $ausgabe -Append } } } ---------------------------------------------------------------------------------- Ich hatte einen anderen Ansatz habe aber nur Teilergebnisse rausbekommen und zwar wurden alle Einträge aus der .txt in einer line hintereinander und nicht untereinander ausgegeben als Beispiel: %servername% ; %Eintrag aus txt mit S% ; %Eintrag aus txt mit S% ; usw.... %servername% ; %Eintrag aus txt mit S% ; %Eintrag aus txt mit S% ; usw.... wäre auch interessant zu wissen wo der Fehler war bzw. wie ich die Einträge in meinem Script untereinander rausbekomme? cls $filepath=Get-ChildItem "C:\Logs" $ausgabe="C:\TMP\datei.csv" $inhalte=$servernamen | Get-Content | Select-String -notmatch "#" $filepath | ForEach-Object { $_.Name + ";" + $inhalte } | Out-File $ausgabe --------------------------------------------------------------------------------- Trotzdem Vielen Dank :) Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.