Benutzer mit den meisten Antworten
Ausgabe in Textdatei sollte nicht mehrzeilig sein

Frage
-
Hi zusammen,
Zuerst einmal möchte ich sagen, dass ich weiss, dass dieses Script weder professionell noch sonderlich schön geschrieben ist.
Ich bin ein absoluter Powershell-Beginner. Bitte verzeiht deshalb die unschöne Schreibweise.Ich habe heute den Auftrag bekommen 1200 Logfiles(geben auskunft über fehlende Treiber) in ein Excel-File zu übertragen und in diesem anschliessend mit Diagrammen das ganze darzustellen. Sprich, welcher Treiber hat wie oft gefehlt etc.
Ich hab mir die Lösung so vorgestellt, dass ich die wichtigen Textstellen aus den .txt-Files auslese und in ein neues txt-file schreibe. Von die Daten in diesem möchte ich dann anschliessend von Excel aus importieren.
Ein Logfile besteht aus jeweils 11 Zeieln. Hier ein Bsp.
*******************************
Computer Details:Manufacturer: Hewlett-Packard
Model: HP xw6600 WorkstationHardware that's not working list
Service Tag: CZC83047TM
Description: PS/2 Compatible Mouse
Device ID: ACPI\PNP0F13\4&17AEE944&0
*******************************Davon brauch ich die Zeilen 3,4,7,9 und 10.
$path = "\\sccm_sources\sccm_sources$\OSDErrorLogs\Missing_Drivers\2013\" $counter = 0 $datas = @(Get-ChildItem "\\sccm_sources\sccm_sources$\OSDErrorLogs\Missing_Drivers\2013" *.txt -name) $arrLength = $datas.Count $Manufacturer = (1..$arrLength) $Model = (1..$arrLength) $ServiceTag = (1..$arrLength) $Description = (1..$arrLength) $DeviceID = (1..$arrLength) $sum = (1..$arrLength) foreach ($element in $datas) { $pather = $path + $element $Manufacturer[$counter] = @(get-content $pather | Where-Object { $_ -like '*Manufacturer:*' }) $Model[$counter] = @(get-content $pather | Where-Object { $_ -like '*Model:*' }) $ServiceTag[$counter] = @(get-content $pather | Where-Object { $_ -like '*Service Tag:*' }) $Description[$counter] = @(get-content $pather | Where-Object { $_ -like '*Description:*' }) $DeviceID[$counter] = @(get-content $pather | Where-Object { $_ -like '*Device ID:*' }) $sum[$counter] = $Manufacturer[$counter] + ";" + $Model[$counter] + ";" + $ServiceTag[$counter] + ";" + $Description[$counter] + ";" + $DeviceID[$counter] $counter ++ }
Die Daten werden ausgelesen und in Arrays abegfüllt. Anschliessend möchte ich wie gesagt das ganze IN EINER ZEILE in eine neue Text-Datei schreiben.
Ich hab dies bis jetzt so versucht.
$sum[$counter] = $Manufacturer[$counter] + ";" + $Model[$counter] + ";" + $ServiceTag[$counter] + ";" + $Description[$counter] + ";" + $DeviceID[$counter]
Die Semikolon sind zur vereinfachung des anschliessend Imports in Excel.
Die Ausgabe in die Text-Datei habe folgendermassen gelöst.
Add-Content C:\Users\KohlJ\Desktop\test.txt $sum[0] -encoding Unicode
Dies ist nur zum Testen. Die Ausgabe wäre auch gleich in der Schleife, allerdings wären das jedesmal 1200 Einträge womit das Script noch länger dauern würde.
Leider erscheint der Text in der neuen Datei nun in Zeilen aufgespalten, sprich für jede Array-Variable und für jedes Semikolon wird eine neue Zeile genommen.
Ich muss das ganze allerdings auf einer Zeile haben :(
Ich hoffe ihr könnt mir helfen und danke schon mal für die Antworten :)
Antworten
-
PowerShell Arbeitet am liebsten mit Objekten nicht mit Text !
In der PowerShell gibt es das Cmdlet Export-CSV für solche Aufgaben, das mag am liebsten Objekte zum fressen!
So geht es:
# Eingabe Pfad mit den .txt dateien $path = "\\sccm_sources\sccm_sources$\OSDErrorLogs\Missing_Drivers\2013\" # Ausgabepfad für die CSV Datei $OutPath = 'C:\temp\CSVDaten.csv' # Alle .txt Dateien aus dem Ordner Holen Get-ChildItem -Path $path -Filter *.txt | ForEach-Object { # Jede Datei hier einzeln verarbeiten # die Aktuelle Datei steckt in der Automatisch generierten Variable $_ # PowerShell Arbeitet mit Objekten nicht mit Text ! # Ein leeres Objekt erstellen das die Ergebnisse sammelt $Result = New-Object PsObject | Select-Object Manufacturer,Model,ServiceTag,Description,DeviceID # Get-Content Liest die Datei zeile für Zeile ein ForEach($Row in Get-Content $_) { # den ersten doppelpunkt finden um die Daten nach dem Doppelpunkt abzuschneiden If($Row.Contains(':')){ $Data = $Row.SubString($Row.IndexOf(':') + 1) } # objekt Properties mit den Daten füllen switch -wildcard ($Row) { '*Manufacturer:*' { $Result.Manufacturer = $Data.Trim()} '*Model:*' { $Result.Model = $Data.Trim()} '*Service Tag:*' { $Result.ServiceTag = $Data.Trim()} '*Description:*' { $Result.Description = $Data.Trim()} '*Device ID:*' { $Result.DeviceID = $Data.Trim()} } } # Objekt mit den gesammelten Ergebnissen in die Pipeline ausgeben (für Export-CSV) $Result } | Export-CSV -Path $OutPath -Delimiter ';' -NoTypeInformation # <-- mit dem Cmdlet Export-CSV die Objekte aus der pipeline in die Datei schreiben
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Bearbeitet Peter Kriegel Dienstag, 28. Januar 2014 16:04
- Als Antwort vorgeschlagen brima Mittwoch, 29. Januar 2014 20:48
- Als Antwort markiert Alex Pitulice Dienstag, 4. Februar 2014 16:15