Die Windows CMD bietet eine brauchbare Druckerverwaltung in der Kommandozeile an.
Dank der printui.dll, die ihr mit der rundll32.exe ansprecht und die alle nötigen Werkzeuge enthält, könnt ihr Drucker hinzufügen, verwaltungen, löschen und mehr.
Dadurch lassen sich bestimmte Jobs wunderbar in Scripte packen.
Code Grundgerüst:
rundll32.exe printui.dll,PrintUIEntry /Parameter
Groß- und Kleinschreibung bei PrintUIEntry beachten, case sensitive.

Nun schauen wir auf die Möglichkeiten von printui.dll.

/a[Datei] Name der Binärdatei
/b[Name] Basisdruckername
/c[Name] UNC-Computername, wenn der Vorgang auf einem Remotecomputer ausgeführt wird.
/dlLöscht den lokalen Drucker.
/dnLöscht die Netzwerkdruckerverbindung.
/ddLöscht
den Druckertreiber.
/eZeigt Druckeinstellungen an.
/f[Datei] Entweder
INF-Datei oder Ausgabedatei.
/gaFügt Druckerverbindungen pro Maschine hinzu.
/geListet Druckerverbindungen pro Maschine auf.
/gdLöscht Druckerverbindungen pro
Maschine.
/h[Arch] Treiberarchitektur Alpha | Intel | Mips | PowerPC.
/iaInstalliert Druckertreiber mithilfe einer INF-Datei.
/idInstalliert
Druckertreiber mithilfe des Assistenten.
/ifInstalliert Drucker mithilfe der
angegebenen INF-Datei.
/iiInstalliert Drucker mithilfe des Assistenten und
einer INF-Datei.
/ilInstalliert Drucker mithilfe des Assistenten.
/inFügt eine Netzwerkdruckerverbindung hinzu.
/j[Anbieter] Druckanbietername
/kDruckt eine
Testseite auf dem angegebenen Drucker aus. Kann bei der Druckerinstallation
nicht verwendet werden.
/l[Pfad] Quellpfad des Druckertreibers
/m[Modell]
Modellname des Druckertreibers
/n[Name] Druckername
/oZeigt die Druckerwarteschlange an.
/pZeigt Druckereigenschaften an.
/qStiller Modus.
Fehlermeldungen werden nicht angezeigt.
/r[Anschluss] Anschlussname (Hier auch
die Möglichkeit Lokale Schnittstellen, anstelle des UNC Pfades anzugeben)
/sZeigt Servereigenschaften an.
/SsSpeichert Druckereinstellungen in einer Datei.
/SrStellt Druckereinstellungen aus einer Datei wieder her. Speichert
Optionsattribute für Druckereinstellungen oder stellt diese wieder her. Die
Attribute müssen am Ende des Befehls  stehen:
2 PRINTER_INFO_2
7 PRINTER_INFO_7
c
Farbprofil
d Druckerdaten
s Sicherheitsbeschreibung
g Globaler DevMode
m
Minimale Einstellungen
u Benutzer-DevMode
r Namenskonflikte lösen
f Namen
erzwingen
p Anschluss zuordnen
/uVerwendet den vorhandenen Druckertreiber,
sofern bereits einer installiert ist
/t[#] Nullbasierte Indexseite zum Starten
/v [Version] Eine der folgenden Treiberversionen:
Windows 95 oder 98 | Windows NT 3.1 | Windows NT 3.5 oder 3.51 | Windows
NT 3.51 | Windows NT 4.0 | Windows NT 4.0 oder 2000 | Windows 2000
/wFordert einen Treiber an, wenn der angegebene
Treiber nicht in der INF-Datei gefunden wird.
/yRichtet den Drucker als
Standarddrucker ein.
/XgLiest Druckereinstellungen.
/XsRichtet
Druckereinstellungen ein.
/zGibt diesen Drucker nicht automatisch frei.
/ZGibt diesen Drucker frei. Verwendung nur mit der Option
/if möglich.
/?Zeigt diese Hilfemeldung an.
@[Datei] Datei mit Befehlszeilenargumenten

Die Tabelle ist von Mark Heitbrink von gruppenrichtlinien.de.

Die volle Hilfe, printui.dll /? ist etwas länger, hat viele Beispiele und wen es interessiert: hier als Download.

Beispielszenario:
Man muss allen Mitarbeitern eines Betriebes bestimmte Drucker eines Druckerservers bereitstellen. Das geht zwar auch über Gruppenrichtlinien aber oftmals hat dieser Weg entscheidende Nachteile, wo sich Scripte besser eignen.

Auf dem Server ist ein Druckserver eingerichtet, der Drucker mit allen Treibern (für das Serversystem und alle Clientsysteme (XP+7 32bit+64bit)) installiert und freigegeben.

Druckerinstallation per Netzwerk:
rundll32.exe printui.dll,PrintUIEntry /in /n „\\server\Canon iR400 EG“
/in steht für „install network printer“, /n gibt den Freigabenamen des Druckers (natürlich mit Verbindung des Servernamens) an.

Sollen mehrere Drucker eingerichtet werden empfielt es sich, das Konstrukt etwas auszubauen. Zum Beispiel kann man in dem Script abhängig von der Etage des Mitarbeiters auch gleich den richtigen Standarddrucker setzen lassen (Parameter /y).

Hier mein Scriptbeispiel:

@echo off
cls

echo Wo befindet sich Ihr Büro?
echo --------------------------
echo 1 - Erdgeschoss
echo 2 - 1. Obergeschoss
echo 3 - Dachetage
set /p etage=Eingabe (1/2/3): 
if %etage%==1 set drucker=KopiererEG
if %etage%==2 set drucker=Kopierer1.OG
if %etage%==3 set drucker=Kopierer2.OG

echo.
echo %drucker% wird als Standarddrucker eingerichtet.
echo.

:drucker1
echo Installiere Kopierer EG
if "%etage%"=="1" goto drucker1std
rundll32 printui.dll,PrintUIEntry /in /n "\\iqbserver\Kopierer EG" >> nul
echo Installation abgeschlossen
echo.
goto drucker2

:drucker1std
echo Definiere als Standarddrucker
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer EG" /y >> nul
echo Installation erfolgreich
echo.
goto drucker2

:drucker2
echo Installiere Kopierer 1.OG
if "%etage%"=="2" goto drucker2std
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer 1.OG" >> nul
echo Installation erfolgreich
echo.
goto drucker3

:drucker2std
echo Definiere als Standarddrucker
rundll32 printui.dll,PrintUIEntry /in /n "\\server\Kopierer 1.OG" /y >> nul
echo Installation erfolgreich
echo.
goto drucker3

REM :drucker3
REM ... und so weiter

Das lässt sich mit beliebig vielen Druckern durchführen, die alle nacheinander auf dem Computer des Mitarbeiters eingerichtet werden. Verbunden mit errorlevel kann man noch cleverer als ich hier reagieren, z.B. den Befehl mit erhöhten Rechten erneut probieren o.Ä. (CPAU Warnung, Nutzung auf eigene Gefahr)

Weitergabe oder Verwendung des Textes nur mit voller Quellen- und Autorangabe! Ich bitte euch, seid fair.

beliebig-viele-pdf-dateien-auf-einmal-drucken-unsplash-teaser

Das Drucken vieler Dokumente auf einmal klingt simpel, hat im Detail jedoch kleine Tücken. Windows bietet bei mehreren markierte Dateien im Kontextmenü „Drucken“ an, jedoch Vorsicht: Je nach Dateityp und Anzahl der Dateien steht diese Option vielleicht nicht zur Verfügung.

Empfehlung: Software mit vielen Features

Ich war selber überrascht, wie anstrengend es ist, nur mit Windows Boardmitteln viele Dateien auf einmal zu drucken. Fazit: Maximal 15 Dateien eines Dateityp desselben Ordners … sehr limitierte Möglichkeiten. Am besten greift man hier zu Software, mit der das kein Problem mehr ist. Wer das nicht möchte oder keine Installationsrechte hat, kann die folgenden Überschriften für die manuellen Vorgehensweisen lesen.

Ich empfehle an dieser Stelle die Freeware Print Conductor. Diese hat eine besonders einfache Oberfläche, unterstützt über 75 Dateiformate und druckt mit nur 3 Klicks alle gewünschten Dateien aus. Das Tool kann jedoch noch viel mehr: Import/Export von Drucklisten, Druckeinstellungen für jedes Dokument unterschiedlich, Druckeinstellungen in einer .ini Datei und somit übertragbar, Deckblätter, Schätzen der Seitenanzahl, Druck-Berichte – hier bleiben keine Wünsche offen.

beliebig-viele-dokumente-auf-einmal-drucken-print-conductor-freeware
Freeware Print Conductor druckt einfach viele Dokumente auf einmal

Müsst ihr das Drucken von Dokumenten im sehr großen Stil fahren oder gar komplex automatisieren? Dann hilft vielleicht auch 2Printer, ein Kommandozeilentool mit ähnlichen Möglichkeiten. Zwei weitere Artikel meines Blogs zum Thema Drucker in Kommandozeilen hier.

Wie es komplett ohne Helfertools geht? Im Folgenden erläutert für PDF, Word, Excel und Bilder.

Manuell: Mehrere PDFs drucken

Bei PDF-Dokumenten werden alle markierten Dateien auf dem Standarddrucker mit den Standardeinstellungen gedruckt. Weitere Druck-Dialoge oder Druck-Anpassungen vorher sind nicht möglich, der Druck erfolgt sofort. Zusätzlich funktioniert das nur bis maximal 15 selektierten PDFs in einem Ordner, ab 16 markierten Dateien verschindet die Option. Beide Probleme lassen sich aber mit derselben Methode umgehen.

beliebig-viele-pdf-dateien-auf-einmal-drucken-pdf-explorer
Explorer Rechtsklick-Kontextmenü bei 15 und 16 markierten PDFs

Lösung bei PDFs: Hier hilft nur das Zusammenfügen aller Dokumente zu einer einzigen PDF, um diese dann zu drucken. Somit lassen sich beliebig viele PDFs auf einmal mit der Möglichkeit der Druck-Anpassung vorher drucken. Das ist glücklicherweise mit Tools wie der Freeware PDFsam Basic sehr einfach zu bewerkstelligen. So geht es: Einfach im „Zusammenführen“ Modus alle gewünschten PDFs in das Fenster ziehen, Zielordner wählen, „Start“ drücken und fertig. Noch einfacher: Dateien markieren -> Rechtsklick -> Senden an -> PDFsam Basic -> Zusammenführen.

mehrere-beliebig-viele-pdf-dokumente-auf-einmal-drucken-pdfsam
PDFs zusammenführen mit PDFsam

Andere Dateitypen drucken

Bei Office-Dokumenten verhält es sich ähnlich: Bis zu 15 Dokumente desselben Dateityps (z.B. xlsx) im selben Ordner lassen sich über das Kontextmenü jeweils drucken, ab 16 verschwindet die Option. Hier müssen die Dateien wieder kombiniert werden, in Word über Einfügen -> Objekt -> Text von Datei. Excel kann manuell über Daten -> Daten abrufen -> Aus Datei mehrere Dokumente z.B. in seperate Tabellenblätter laden, alternativ gibt es Makros und Skripts für das automatische Mergen vielen Excel-Dateien. Wirklich nutzerfreundlich ist das alles nicht, aber letztlich funktioniert es.

Einfacher ist es dagegen bei Bilddateien unterschiedlicher Dateitypen. Diese können über das Kontextmenü gedruckt werden, selbst wenn mehr als 15 Dateien unterschiedlicher Bildformate ausgewählt wurden. Außerdem erscheint vor dem Druck ein eigener Dialog, der es ermöglicht, Druckeinstellungen anzupassen und z.B. Collagen zu drucken:

mehrere-beliebig-viele-pdf-dokumente-auf-einmal-drucken-bilder
Mehrere Bilddateien drucken mit „Windows Bilder drucken“

Fazit bleibt: Hier könnte Windows unbedingt nachbessern und einen umfangreicheren Druckservice anbieten, unabhängig von Anzahl, Typ und Ort der Datei sowie unabhängig von der Art der Ausgabe (Drucken, „To PDF“ usw.). Bis dahin sind Softwares wie Print Conductor schon die beste Möglichkeit für größere Druckvolumen.

Ziel ist es, mit einem unbeaufsichtigten Script (also ohne Benutzereingaben etc) alle installierten Netzwerkdrucker (lokal installiert, nicht vom Druckerserver), von denen die IPs bekannt sind, zu löschen. Dieser Vorgang soll unabhängig vom vergebenen Druckernamen auf jedem beliebigen PC funktionieren.

Szenario

Wir haben zum Beispiel 14 verschiedenen Drucker installiert. Nun wollen wir 8 von denen deinstallieren und danach neu installieren. Von den 8 Druckern ist der Name nicht bekannt, da diese bei der Installation beliebig benannt wurden. Da dieser Vorgang auf dutzenden oder hunderten PCs funktionieren soll, ist der Name ein schlechter Anlaufpunkt. Stattdessen wissen wir aber die IP jedes Druckers, der deinstalliert werden soll.
Lokale Drucker wie PDF Drucker oder Microsoft-interne Drucker sollen unberührt bleiben.

Wie löschen wir am besten Drucker scriptbasiert? Mit printui.dll via CMD.
Zum Löschen nutzen wir den Befehl:

rundll32 printui.dll,PrintUIEntry /dl /n "Name des Druckers"

Wie gesagt kennen wir die Druckernamen nicht. Aufgabe ist also, den Namen der gewünschten Drucker zu bekommen und mit diesem dann den Löschbefehl zu starten.

Den Namen bekommen wir (indirekt) von der WSH Funktion EnumPrinterConnections.

Also Schritt 1, Druckernamen herausfinden:

show-printers.vbs

Set WshShell = CreateObject("Wscript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
Set objPrinters = WshNetwork.EnumPrinterConnections
For i = 0 to objPrinters.Count - 1 Step 2
   WScript.Echo "Port: " & objPrinters.Item(i) & " | Name: " & objPrinters.Item(i+1)
Next

.vbs Download (Rechtsklick -> Ziel speichern) | Codegrundlage

Probiert es mal aus, beim Ausführen der .vbs werden alle installierten Drucker nacheinander mit Port und Name angezeigt. objPrinters.Item ist also unser Freund. Die einzelnen Codezeilen erkläre ich nachher im Gesamtbild.

Wir können also die Druckernamen herausfinden und für den printui.dll Löschbefehl weiterverwenden.
Nun wollen wir aber nicht alle installierten Drucker löschen sondern nur die gewünschten Drucker, dessen IPs wir nennen. Zudem sollen Systemdrucker (Microsoft-interne, PDF Drucker etc) erhalten bleiben, genauso wie durch Druckserver hinzugefügte Drucker.

Also schauen wir uns das Konstrukt mal an:

delete-printers.vbs:

Set WshShell = CreateObject("Wscript.Shell")
printer = Array("111.40.162.60", "111.40.162.90", "111.40.162.100", "111.40.162.105", "111.40.162.120", "111.40.162.129", "111.40.162.140")
Set WshNetwork = CreateObject("WScript.Network")
Set objPrinters = WshNetwork.EnumPrinterConnections
For i = 0 to objPrinters.Count - 1 Step 2
  If Left(objPrinters.Item(i+1),2) <> "\\" Then
    For Each item In printer
      If Len(item) >= 2 Then
        If InStr(objPrinters.Item(i), item) > 0 Then
          WshShell.Run "cmd /c rundll32 printui.dll,PrintUIEntry /dl /n " & Chr(34) & objPrinters.Item(i+1) & Chr(34)
        End If
      End If
    Next
  End If
Next

.vbs Download (Rechtsklick -> Ziel speichern)

Nun im Detail:
Zeile 2 enthält, mit Kommata getrennt, die IPs aller Drucker, die gelöscht werden sollen.
Zeile 4 speichert in der Variable objPrinters alle Druckerobjekte.
Zeile 5 startet die Schleife, die so oft durchläuft, wie es Druckerobjekte (objPrinters.Count – 1) gibt. Die Schleife in 2er Schritten (Step 2) durchzugehen muss sein. Denn:
Nachdem EnumPrinterConnections in objPrinters geschrieben hat, sieht objPrinters etwa so aus, um es mal bildlich zu haben und die folgenden Codezeilen einfacher zu verstehen:

Step 2i=AbfrageTypWert
0x0objPrinters.Item(i)Portname[IP_111.40.162.60]
0x1objPrinters.Item(i+1)Druckername .60[Drucker-1]
1x2objPrinters.Item(i)Portname[IP_111.40.162.90_2]
1x3objPrinters.Item(i+1)Druckername .90[Kopierer_EG]
2x4objPrinters.Item(i)Portname[111.40.162.105_1]
2x5objPrinters.Item(i+1)Druckername .105[EG – Netzdrucker]

… usw.
Wir überprüfen den Portnamen, der die IP enthält, aber durch „IP_“ am Anfang oder „_X“ am Ende doch stark variieren kann. Dazu später mehr.
Ab Zeile 6 Nun wird für jeden Port durchgegangen (da jeder 2. Step den Druckernamen überspringt und zum nächsten Port springt):
Zeile 6 prüft mit Left(XXXXXX,2) die ersten 2 Stellen des Druckernamens. Sind diese nicht „\\“ so handelt es sich nicht um einen Druckerserver-Drucker und die Schleife wird fortgeführt.
Zeile 7 startet eine Schleife, die jeden Eintrag des Arrays printer durchgeht. In diesem Array stehen alle Drucker-IPs, die wir löschen wollen.
Zeile 8 prüft, ob der Eintrag des Arrays, der überprüft wird, 2 oder mehr Zeichen lang ist. Ehrlich gesagt, keine Ahnung warum ich damals diese Abfrage eingebaut habe…. 😀 wenn ich drauf kommt packe ich es als edit dazu. Mit Kommentaren wäre das nicht passiert, ich weiß.
Zeile 9 vergleicht den Druckerport (objPrinters.Item(i)) und die eingelesene IP, also: „IP_111.40.162.90_2 <> 111.40.162.90″ und prüft, ob der eingelesene Arraywert im Portnamen vorkommt. Ist der Rückgabewert > 0, so wurde der String 2 (IP aus dem Array) in String 1 (Portname) gefunden. Ist wie Regular Expressions, nur simpler. Wer gut regexen kann, hier könnte es Sinn machen.
Zeile 10 ist nun der Löschbefehl. objPrinters.Item(i+1) steht hier also für einen Druckernamen, der weder Druckserverdrucker noch lokaler Drucker noch ungewollter Drucker ist.
Da wir den Löschbefehl

printui.dll,PrintUIEntry /dl /n "Name"

über

WshShell.Run "Befehl"

laufen lassen müssen, dessen Befehl in Anführungszeichen stehen muss, kriegen wir ein kleines Problem. So würde es nämlich aussehen:

WshShell.Run "cmd /c rundll32 printui.dll,PrintUIEntry /dl /n "Druckername"

Der schlaue Leser weiß längst, dass hier der vbs Befehl nach dem /n als beendet angesehen wird und das Script damit fehlschlägt. Um den Namen des Druckers für printui.dll in Anführungszeichen zu kriegen, nutzen wir das Chr(34), das in ein “ umgewandelt wird. Der vbs Befehl läuft damit weiter und dem CMD Befehl wird ein “ vorgegeben.

Fertsch, Drucker wird gelöscht.

Voraussetzung für das Löschen ist natürlich das Recht dazu, Adminrechte also. CPAU kann helfen, doch wie immer Vorsicht, CPAU ist nicht sicher. Dank Kenny… 😛

Das Programm ist funktionsfähig, getestet und im Produktiveinsatz. Bei Fragen, Wünschen, Verbesserungen oder Kritik etc, Kommentarfeld ist unten oder per Mail/Kontakt.

delete-printer.vbs mit Parametern

Danke an Kenny für die Parameter Idee, macht das Script viel flexibler als zuvor!

Set WshShell = CreateObject("Wscript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
Set objPrinters = WshNetwork.EnumPrinterConnections
If WScript.Arguments.Count = 0 Then
   WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
Else
   Dim first
   first = WScript.Arguments(0)
   Select Case first
      Case "help" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case "/?" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case "-?" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case "?" WScript.Echo "Usage: delete-printer.vbs "&Chr(34)&"Portname1"&Chr(34)&" "&Chr(34)&"Portname2"&Chr(34)&" ..."
      Case Else 
   End Select
End If
For i = 0 to objPrinters.Count - 1 Step 2
   If Left(objPrinters.Item(i+1),2) <> "\\" Then
      For Each item In WScript.Arguments
         If Len(item) >= 2 Then
            If InStr(objPrinters.Item(i), item) > 0 Then
               WshShell.Run "cmd /c rundll32 printui.dll,PrintUIEntry /dl /n " & Chr(34) & objPrinters.Item(i+1) & Chr(34)
            End If
         End If
      Next
   End If
Next

.vbs Download (Rechtsklick -> Ziel speichern)

Okay, was hat sich geändert? Das Array ist weg und wird durch Parameter ersetzt. Diese werden beim Aufruf einfach hinten angehängt. Mehrere Parameter werden mit Leerzeichen getrennt angegeben. Ein Parameter mit Leerzeichen drin wird einfach in Anführungzeichen angegeben. Das lässt sich also beliebig kombinieren.
Wird kein Parameter angegeben (Doppelklick z.B.) bzw. ist der erste Parameter „help“ o.Ä. so wird eine Usage Hilfe angezeigt.

Beispiel:

delete-printer.vbs 111.40.162.90 111.40.162.105 "Farbe EG" "Farbe 1.OG"

Dieser Aufruf hätte 4 Parameter und würde alle Drucker löschen, die diese 2 Zeichenketten im Portnamen enthalten.

BTW: für VBS Neulinge, hier hab ich etwas Codehilfe her.

Weitergabe oder Verwendung der Anleitung nur mit voller Quellen- und Autorangabe! Ich bitte euch, seid fair.