pago159
Goto Top

CSV-Datei in Powershell einlesen und mit foreach weiterverarbeiten

Liebe Kolleginnen und Kollegen,

ich habe das Script, für die Druckereinrichtung um einiges erweitert, zum einem habe ich einen Export in eine CSV-Datei eingebaut, zum anderen eine direkte Bildschirmanzeige aller eingerichteten Drucker auf dem entsprechenden Printserver.
Nun möchte ich allerdings auch noch eine CSV-Datei einlesen können, um schnell mehrere Drucker erstellen zu können.
Hier mein Scriptteil:

 $ImportPrinter = {

  $printers = Import-Csv "C:\Logs\AddPrinter\import.txt"  –Delimiter ';'   

foreach ($printer++ in $printers){
$printer 

$drivername = import-csv "C:\Logs\AddPrinter\import.txt" | Where-Object {$_.department -eq "drivername"}  
$RAWportname = import-csv "C:\Logs\AddPrinter\import.txt" | Where-Object {$_.department -eq "portname"}  
$sharename = import-csv "C:\Logs\AddPrinter\import.txt" | Where-Object {$_.department -eq "sharename"}  
$location = import-csv "C:\Logs\AddPrinter\import.txt" | Where-Object {$_.department -eq "location"}  
$comment = import-csv "C:\Logs\AddPrinter\import.txt" | Where-Object {$_.department -eq "comment"}  


   Try{
        $printserver = $comboPrintServer.Text
        $portname = "IP_$($RAWportname)"  
    
        # create printer port
        $wmi = ([WMICLASS]"\\$printserver\ROOT\cimv2:Win32_TCPIPPrinterPort")  
        $wmi.psbase.scope.options.enablePrivileges = $true
        $port = $wmi.CreateInstance()
        $port.Name = $portname
        $port.Protocol = 1  
        $port.HostAddress = $RAWportname
        $port.SNMPEnabled = $False
        $port.put()

        #create printer instance
        $print = ([WMICLASS]"\\$printserver\ROOT\cimv2:Win32_Printer").createInstance()   
        $print.Drivername = $printer.drivername
        $print.PortName = $portname
        $print.Shared = $true
        $print.Published = $true
        $print.Sharename = $sharename
        $print.Location = $location
        $print.Comment = $comment
        $print.DeviceID = $sharename
        $print.put()
        return $true
     }catch{
        return $_.Exception.Message
     }
  }
  }

Ich bekomme bei der Variablenerstellung leider keine Daten angegeben. Die Variable $Printers ist mit den Druckern gefüllt und die Variable $printer ist mit dem entsprechenden Drucker zum Import und der Erstellung des Ports gefüllt. Sobald ich das ganze weiter aufdröseln möchte, geht dies nicht mehr.

Ich habe auch schon versucht:

$drivername = $printer.drivername

auch dies führte zum selben Ergebnis, die Variable blieb leer.
Wo liegt mein Denkfehler?

Vielen dank schon mal für die Hilfe.

Content-ID: 257499

Url: https://administrator.de/contentid/257499

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

colinardo
Lösung colinardo 12.12.2014 aktualisiert um 12:14:22 Uhr
Goto Top
Moin,
foreach ($printer++ in $printers){
das ++ ist schon mal falsch ... deswegen haben deine Folgeversuche nicht funktioniert.

Also insgesamt sähe das dann etwa so aus, aber ich kenne den Aufbau deiner CSV-Datei leider nicht
 $ImportPrinter = {
    $printers = Import-Csv "C:\Logs\AddPrinter\import.txt" –Delimiter ';'   

    foreach ($printer in $printers){

        $drivername = $printer.drivername
        $RAWportname = $printer.portname
        $sharename = $printer.sharename
        $location = $printer.location
        $comment = $printer.comment

        Try{
            $printserver = $comboPrintServer.Text
            $portname = "IP_$($RAWportname)"  
    
            # create printer port
            $wmi = ([WMICLASS]"\\$printserver\ROOT\cimv2:Win32_TCPIPPrinterPort")  
            $wmi.psbase.scope.options.enablePrivileges = $true
            $port = $wmi.CreateInstance()
            $port.Name = $portname
            $port.Protocol = 1  
            $port.HostAddress = $RAWportname
            $port.SNMPEnabled = $False
            $port.put()

            #create printer instance
            $print = ([WMICLASS]"\\$printserver\ROOT\cimv2:Win32_Printer").createInstance()   
            $print.Drivername = $drivername
            $print.PortName = $portname
            $print.Shared = $true
            $print.Published = $true
            $print.Sharename = $sharename
            $print.Location = $location
            $print.Comment = $comment
            $print.DeviceID = $sharename
            $print.put()
         }catch{
            write-host $_.Exception.Message
         }
    }
}
Grüße Uwe
Pago159
Pago159 12.12.2014 um 12:09:01 Uhr
Goto Top
Hallo Uwe,

schon mal wieder vielen dank hierfür.

Die $printers Variable zeigt mir nun meine 9 Testdrucker an, die Variablen werden auch für die Erstellung des Druckers gefüllt,
nur leider funktioniert die foreach Schleife anscheinend nicht, da nur ein Drucker erstellt wird.

hättest du hier auch eine Lösung für micht?

Danke Pago
colinardo
colinardo 12.12.2014 aktualisiert um 12:16:30 Uhr
Goto Top
Zitat von @Pago159:
nur leider funktioniert die foreach Schleife anscheinend nicht, da nur ein Drucker erstellt wird.
hättest du hier auch eine Lösung für micht?
ja, die Zeile
return $true
rausnehmen .. die beendet ja den Scriptblock nach dem ersten Drucker face-wink
Pago159
Pago159 12.12.2014 um 12:42:00 Uhr
Goto Top
Super, vielen dank, für die schnelle Hilfe von dir.
Jetzt stellt sich die Frage, wo übergebe ich nun das $true, damit ich in die richtige Abschlussmeldung gelange?
ohne das return true, erhalte ich nun meine Meldung, dass ein Fehler aufgetreten ist und in meiner Logdatei ist kein Eintrag enthalten.
colinardo
colinardo 12.12.2014 aktualisiert um 12:51:59 Uhr
Goto Top
Zitat von @Pago159:
Jetzt stellt sich die Frage, wo übergebe ich nun das $true, damit ich in die richtige Abschlussmeldung gelange?
ohne das return true, erhalte ich nun meine Meldung, dass ein Fehler aufgetreten ist und in meiner Logdatei ist kein Eintrag
enthalten.
für diesen Fall in meinem Script dann zwischen Zeile 40 und 41