none
Ausgabe in Textdatei sollte nicht mehrzeilig sein RRS feed

  • 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 Workstation

    Hardware 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 :)

    Dienstag, 28. Januar 2014 13:55

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
    Dienstag, 28. Januar 2014 16:02