Zum Inhalt wechseln


Foto

Ergebnisse sortiert in eine CSV-Datei übergeben


  • Bitte melde dich an um zu Antworten
Eine Antwort in diesem Thema

#1 BrTzL

BrTzL

    Newbie

  • 46 Beiträge

 

Geschrieben 19. Oktober 2017 - 12:29

Guten Tag zusammen,

 

ich übe mich gerade im Umgang mit der PowerShell. Wie ich nun bemerke ein sehr mächtiges Tool welches ich bisher (zu meiner Schande) ignoriert habe.

Als Sysadmin betreue ich über 300 Arbeitsplätze. Um mich mit PowerShell vertraut zu machen möchte ich über PS eine Inventarisierung der angeschlossenen Drucker durchführen.

 

Mit Hilfe dieser Seite https://krausens-onl...ten-excelliste/ (und noch vielen anderen) habe ich mir ein Skript gebastelt:

cls
# Collect port names and host addresses into hash table
$hostAddresses = @{}
$File=$env:COMPUTERNAME+".csv"
Get-WmiObject Win32_TCPIPPrinterPort | ForEach-Object {
  $hostAddresses.Add($_.Name, $_.HostAddress)
}

# Ausgabe Druckername, IP-Adresse, Computername
Get-WmiObject Win32_Printer | ForEach-Object {
  New-Object PSObject -Property @{
    "Drucker-Name" = $_.Name
    "IP-Adresse" = $hostAddresses[$_.PortName]
    "Computer" = $env:COMPUTERNAME
  }

# Ergebnis in CSV schreiben.
} |Export-Csv \\Pfad\"$File"

# Überflüssige Zeilen und Drucker filtern und in gesammelter CSV speichern
Get-content \\Pfad\$File | Select-String -pattern "FreePDF|An OneNote|Fax|Microsoft XPS|#TYPE System.Management.Automation.PSCustomObject|Drucker-Name" -notmatch |add-content \\Pfad\CSV_Drucker.csv

Ich möchte also nur Druckernamen, eventuelle IP des Druckers und den Computernamen erfassen und in eine CSV schreiben. Diese CSV wird anschließend noch mal angefasst, Einträge gefiltert und die Ergebnisse anschließend in eine gesammelte Übersichts-CSV geschrieben. Das funktioniert auch.

 

Nun zum Knackpunkt:

Führe ich das Skript am PC1 aus werden die Ergebnisse in der Reihenfolge Drucker --> Computername --> IP gespeichert.

Bei PC2 speichert das Skript die Reihenfolge in IP --> Drucker --> Computername

 

In meiner Übersichts-CSV habe ich dann alles durcheinander und habe dadurch keine vernünftige Übersicht. Meine zentrale Frage lautet daher:

Was muss ich im Skript ändern, damit die Ergebnisse immer in der gleichen Reihenfolge gespeichert werden?

 

Bonuspunkte:

Ich habe vor das Skript einmalig auf jedem Rechner laufen zu lassen, da sonst die Ergebnisse immer wieder neu eingetragen werden. Oder gibt es eine elegante Möglichkeit, dass dieses Skript als Startskript laufen kann und nur Änderungen eingetragen werden?

 

Über Anregungen und Kritik würde ich mich sehr freuen. Auch wenn vielleicht noch Verbesserungen am eigentlichen Skript vorgenommen werden können. Wie gesagt: Bin noch blutiger Anfänger :-)

 

Mit freundlichem Gruß

BrTzL



#2 BOfH_666

BOfH_666

    Junior Member

  • 144 Beiträge

 

Geschrieben 19. Oktober 2017 - 13:10

Wenn Du schon mit CSV-Dateien arbeitest, solltest Du auch die cmdlets benutzen, die dafür gemacht sind. Das macht Dir das Leben leichter. Um mit den Daten einer CSV-Datei weiterzuarbeiten oder erneut zu arbeiten, ist es viel besser Import-CSV zu benutzen anstatt Get-Content. Dann arbeitest Du nicht mit "flachem" Text, sondern mit Arrays und Properties und brauchst es auch nachher nicht wieder aufwändig sortieren.


Ich würde dann auch eher versuchen, die überflüssigen Daten soweit "vorne" wie möglich rauszufiltern … vielelicht so hier irgendwie:

$PrinterListFileName = $env:COMPUTERNAME + ".csv"

$hostAddresses = @{}
Get-CimInstance -ClassName Win32_TCPIPPrinterPort | 
    ForEach-Object {
        $hostAddresses.Add($_.Name, $_.HostAddress)
    }

$PrinterList = Get-CimInstance -ClassName Win32_Printer | 
    Where-Object {$_.Name -notmatch 'FreePDF|An OneNote|Fax|Microsoft XPS|#TYPE System.Management.Automation.PSCustomObject|Drucker-Name'} |
        ForEach-Object {
          [PSCustomObject]@{
            'Drucker-Name' = $_.Name
            'IP-Adresse' = $hostAddresses[$_.PortName]
            'Computer' = $env:COMPUTERNAME
          }
        }

$PrinterList
$PrinterList | 
    Export-Csv -Path $PrinterListFileName -Encoding UTF8 -Delimiter ';' -NoTypeInformation

Bearbeitet von BOfH_666, 19. Oktober 2017 - 13:02.

live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''