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-Key: 217852

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

Printed on: April 26, 2024 at 21:04 o'clock

Member: colinardo
colinardo Sep 25, 2013 updated at 21:23:07 (UTC)
Goto Top
Hallo Matthias,
Versuchs mal in Zeile 5 hiermit (ungetestet)
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("\\CONTOSO-PRINT1\$($_.ShareName)"

Grüße Uwe
Member: mguenth83
mguenth83 Sep 26, 2013 at 05:44:35 (UTC)
Goto Top
Hi Uwe,
danke für die Bemühungen aber leider hat es nicht funktioniert...schade eigentlich...

Gruß
Matze
Member: colinardo
colinardo Sep 26, 2013 at 06:10:33 (UTC)
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
Member: mguenth83
mguenth83 Sep 26, 2013 at 06:32:36 (UTC)
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
Member: colinardo
colinardo Sep 26, 2013 updated at 07:07:33 (UTC)
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
Member: mguenth83
mguenth83 Sep 26, 2013 at 07:18:04 (UTC)
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   : 
Member: colinardo
colinardo Sep 26, 2013 updated at 07:33:10 (UTC)
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.
Member: mguenth83
mguenth83 Sep 26, 2013 at 10:00:47 (UTC)
Goto Top
Funktioniert perfekt....vielleicht sollte ich mal nen Powershellkurs machen...jedenfalls wieder was dazu gelernt.