Jump to content

Relaunch 2018: Willkommen im neuen Forum - Das MCSEboard.de wurde runderneuert. Wir wünschen Euch viel Spaß an Board.

Melde dich an, um diesem Inhalt zu folgen  
BrTzL

Ergebnisse sortiert in eine CSV-Datei übergeben

Empfohlene Beiträge

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-online.de/druckserver-netzwerkdrucker-mit-powershell-auflisten-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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesem Inhalt zu folgen  

×