mguenth83
Goto Top

ForEach Schleife für Drucker funktioniert nicht

Hi,
ich wollte bei einer Migration die Druckernamen auslesen lassen, diese dann speichern und auf den neuen System wieder verbinden.

Habt Ihr eine Ahnung warum meine ForEachschleife nicht funktioniert ?
Versuche auf der Inhalt der in der Variable drauf zu zugreifen damit er alle vier Drucker anlegt.

$Drucker = Get-WmiObject -Class Win32_Printer | Select-Object -Property ShareName, SystemName | Where-Object -Like -Property SystemName -Value \\CONTOSO-PRINT1 |Select-Object -Property ShareName
$WindowsVersion = [System.Environment]::OSVersion.Version
if ($WindowsVersion.Build -ge 7601) {
$Drucker | ForEach-Object {
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("$_.ShareName")  
}}

Das hier steht in der Variablen...
ShareName                                                                                                                   
---------                                                                                                                   
HPLJ_PRO_400M400                                                                                                         
KONICAMINOLTA_1                                                                                                       
KYOCERA_TASKALFA_01                                                                                                   
KYOCERA_TASKALFA_02

Content-ID: 217852

Url: https://administrator.de/forum/foreach-schleife-fuer-drucker-funktioniert-nicht-217852.html

Ausgedruckt am: 21.12.2024 um 05:12 Uhr

colinardo
colinardo 25.09.2013 aktualisiert um 23:23:07 Uhr
Goto Top
Hallo Matthias,
Versuchs mal in Zeile 5 hiermit (ungetestet)
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("\\CONTOSO-PRINT1\$($_.ShareName)"

Grüße Uwe
mguenth83
mguenth83 26.09.2013 um 07:44:35 Uhr
Goto Top
Hi Uwe,
danke für die Bemühungen aber leider hat es nicht funktioniert...schade eigentlich...

Gruß
Matze
colinardo
colinardo 26.09.2013 um 08:10:33 Uhr
Goto Top
Wenn du das Script auf dem gleichen Rechner ausführst wo die Verbindungen noch existieren kann das erneute Hinzufügen ja nicht klappen. Speichere die Daten pro Client z.B. in einer Textdatei wie in diesem Beispiel: http://social.technet.microsoft.com/Forums/windowsserver/de-DE/1da4e996 ...

Grüße Uwe
mguenth83
mguenth83 26.09.2013 um 08:32:36 Uhr
Goto Top
Hey Uwe,
öhm ja deswegen habe ich Zeile Eins auskommentiert und nur eine Textdatei als Input genommen. Somit kann ich noch nicht vorhandene Drucker per Hand in die TXT schreiben die dann eigentlich hätte funktionieren sollen.

Gruß
Matze
colinardo
colinardo 26.09.2013 aktualisiert um 09:07:33 Uhr
Goto Top
öhm ja deswegen habe ich Zeile Eins auskommentiert
Stand leider nirgendwo in deinem Thread bzw. Script.
Hiermit hatte ich bei einem Test keine Probleme:
$Drucker = .......
$objPrint = [wmiclass] "Win32_Printer"  
$Drucker | %{$objPrint.AddPrinterConnection("\\CONTOSO-PRINT1\$($_.ShareName)")}  

Wäre auch nett wenn du zumindest mal die Ausgabe deines Scriptes posten würdest dann hätten wir mehr Ansätze

noch was, das auslesen deiner Drucker mit deiner ersten Zeile ginge auch einfacher:
$Drucker = Get-WmiObject -Class Win32_Printer |?{$_.SystemName -eq "\\CONTOSO-PRINT1" -and $_.ShareName -ne $null} | select -ExpandProperty ShareName  

Grüße Uwe
mguenth83
mguenth83 26.09.2013 um 09:18:04 Uhr
Goto Top
Irgendwie bin ich glaub ich zu blöd für Powershell. Deine Variante von der Ersten Zeile gibt überhaupt nichts aus.

Das andere funktioniert auch nicht wirklich...

Get-WmiObject -Class Win32_Printer|Select-Object -Property ShareName, SystemName|Where-Object -Like -Property SystemName -Value \\CONTOSO-PRINT1|Select-Object -Property ShareName|Format-Table ShareName -HideTableHeaders|Out-File C:\Temp\Printer.txt
Get-Content "C:\Temp\printer.txt"  
$WindowsVersion = [System.Environment]::OSVersion.Version
if ($WindowsVersion.Build -ge 7601) {
    $File2=Get-Content "C:\Temp\printer.txt"  
    $File2.Replace(" ",$null) | Out-File "C:\Temp\printer.txt"  
    $Printer = Get-Content "C:\Temp\printer.txt"  

$objPrint = [wmiclass] "Win32_Printer"   
$Printer | ForEach-Object {
$Printer | %{$objPrint.AddPrinterConnection("\\CONTOSO-PRINT1\$($_.ShareName)")}  
}}

Bringt nur wirre Zeichen als ausgabe....
KONICAMINOLTA_11                                                                                                       




__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     : 
__DYNASTY        : __PARAMETERS
__RELPATH        : 
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         : 
__NAMESPACE      : 
__PATH           : 
ReturnValue      : 1801
PSComputerName   : 

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     : 
__DYNASTY        : __PARAMETERS
__RELPATH        : 
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         : 
__NAMESPACE      : 
__PATH           : 
ReturnValue      : 1801
PSComputerName   : 
colinardo
colinardo 26.09.2013 aktualisiert um 09:33:10 Uhr
Goto Top
Das kann so auch nicht gehen .... dein Script ist voller Fehler
machs so ...
Get-WmiObject -Class Win32_Printer |?{$_.SystemName -eq "\\CONTOSO-PRINT1" -and $_.ShareName -ne $null} | select -ExpandProperty ShareName | Out-File C:\Temp\Printer.txt  
$Drucker = Get-Content "C:\Temp\printer.txt"  
$WindowsVersion = [System.Environment]::OSVersion.Version
if ($WindowsVersion.Build -ge 7601) {
  $objPrint = [wmiclass] "Win32_Printer"   
  foreach ($d in $Drucker){
    $objPrint.AddPrinterConnection("\\CONTOSO-PRINT1\$d")}  
  }
}

Und die Ausgabe ist nicht wirres Zeug sondern sagt zum Beispiel aus das der Fehler 1801 aufgetreten ist und das bedeutet: Invalid Printer Name (http://msdn.microsoft.com/en-us/library/aa384769%28v=vs.85%29.aspx)
Wenn dort ReturnValue = 0 ist wurde die Verbindung erfolgreich hinzugefügt.
mguenth83
mguenth83 26.09.2013 um 12:00:47 Uhr
Goto Top
Funktioniert perfekt....vielleicht sollte ich mal nen Powershellkurs machen...jedenfalls wieder was dazu gelernt.