Ein Beitrag von Marc (RE: Bei Druckauftrag Drucker automatisch einschalten u. wieder ausschalten | Idee/Anleitung | Tasmota) zum automatischen Druckerstart unter Linux hat mir keine Ruhe gelassen, sodass ich mich daran gesetzt habe, die Überwachung der Druckerwarteschlange unter Windows 10 zu realisieren. Es ist mir tatsächlich gelungen! Durch die powershell ist mir Windows wieder richtig sympathisch geworden ;-). Und so geht es:
Voraussetzung: Keine Angst vor der Powershell
Dabei haben mir natürlich meine Linux-Kenntnisse enorm geholfen.
Schritt 1:
Die powershell als Administrator starten. Eingabe:
Set-ExecutionPolicy Unrestricted <enter>
Nebenwirkung: Nun werden alle Powershell-Skripte ohne Nachfrage ausgeführt. Wer das nicht will, muss sich mit dem Thema Digitale Zertifikate befassen.
Nun das powershell (Administrator-) Fenster schließen. Anschließend die powershell als normaler User erneut öffnen und folgenden Befehl abschicken:
Get-WMIObject -Class Win32_Printer
Es wir eine Liste aller verfügbaren Drucker und Scanner(!) angezeigt. Achtung: Bei Multifunktionsgeräten, müsst ihr aufpassen das richtige Geräte, also den Drucker zu erwischen. Relevant ist der Name, der hinter Name: steht.
Zusätzlich die App Editor öffnen und dieses Skript einkopieren:
get-Command -noun json
$PrinterSwitchIP = "HIER_DIE_IP_DES_SCHALTERS"
$PrinterName = "HIER_WARTESCHLANGEN-NAME"
$SwitchOffTime = 300
$Counter = 0
while ($true) {
start-sleep -Milliseconds 1000
$Job = Get-PrintJob -PrinterName $PrinterName
if ($Job -ne $null) {
$URL = "http://"+$PrinterSwitchIP+"/cm?cmnd=Power"
$StatusIs = Invoke-WebRequest -URI $URL -UseBasicParsing
$StatusPower = $StatusIs.Content
#Write-Host $StatusPower
if ($StatusPower -eq '{"POWER":"ON"}') {
#Write-Host "Aktueller Zustand: ON"
$Counter = 0
}
else {
#Write-Host "Aktueller Zustand: OFF, ich schalte ein"
$URL = "http://"+$PrinterSwitchIP+"/cm?cmnd=Power ON"
$StatusIs = Invoke-WebRequest -URI $URL -UseBasicParsing
#Write-Host "Sende ON"
}
}
if ($Job -eq $null -and $Counter -eq $SwitchOffTime) {
$URL = "http://"+$PrinterSwitchIP+"/cm?cmnd=Power"
$StatusIs = Invoke-WebRequest -URI $URL -UseBasicParsing
$StatusPower = $StatusIs.Content
Write-Host ""
if ($StatusPower -eq '{"POWER":"OFF"}') {
$Counter = 0
}
#Write-Host "Ich schalte ab."
$Counter = 0
$URL = "http://"+$PrinterSwitchIP+"/cm?cmnd=Power OFF"
$Status = Invoke-WebRequest -URI $URL -UseBasicParsing
#Write-Host $Status.POWER
}
$Counter += 1
#Write-Host $Counter
}
Alles anzeigen
In Zeile 2 müsst ihr in der Variablendefinition die IP des Basic oder S20 angeben, an der der Drucker hängt, und in Zeile 3 den Namen der Druckerwarteschlange, die überwacht werden soll. In Zeile 4 definiert ihr (in Sekunden), nach welcher Zeit der Schalter nach dem letzten Druckjob abgeschaltet wird. Falls in der Abschaltzeit - im Skript 5 Minuten - ein neuer Druckjob eintrifft, wird der Sekundenzähler wieder auf 0 zurückgesetzt. Dann wählt ihr Speichern unter, stellt den Dateityp von Textdateien auf Alle Dateien um und vergebt den Namen spoolctl.ps1. (Hinweis zum Debugging: Wenn ihr sehen wollt, was das Skript so veranstaltet, dann müsst ihr das Zeichen # vor den Befehlen Write-Host... entfernen.)
Vermutlich ist das Skript nun im Ordner Dokumente gelandet. Deshalb geht ihr jetzt zurück in das Fenster der powershell und gebt dort bitte als erstes cd documents <enter> ein. Die powershell verwendet die originalen Ordnernamen nicht die symbolischen deutschen Bezeichnungen des GUI. Mit dir spoolctl.ps1 überprüft ihr, ob das Skript auch tatsächlich hier liegt. Mit folgendem Befehl wird es gestartet: .\spoolctl.ps1<enter>.
Für den ersten Test wäre es sinnvoll, wenn vor dem Start des Skriptes der Basic oder die S20, an der der Drucker hängt, ausgeschaltet ist. Wenn ihr nun an den angegebenen Drucker z. B. eine Testseite schickt, sollte der Drucker(schalter) eingeschaltet werden und 5 Minuten nach Ende des Druckjobs auch wieder ausgeschaltet werden.
Abgebrochen wird das Skript durch gleichzeitiges Drücken der beiden Tasten STRG (und) C.
Hinweise zum Start des Skriptes im Hintergrund
Von der powershell-Konsole aus gebt ihr folgenden Befehl ein, wenn ihr noch im Ordner documents seid:
PowerShell.exe -windowstyle hidden { .\spoolctl.ps1 }
Bei einer frisch gestarteten powershell ist es, weil ihr dann im übergeordneten Ordner seid, so:
PowerShell.exe -windowstyle hidden { documents\spoolctl.ps1 }
Um beim Systemstart das Skript zu laden legt ihr mit der App Aufgabenplanung eine neue Aufgabe mit dem Assistenten an:
Klick auf "Aufgabe erstellen" -> Name und Beschreibung angeben und unten rechts Windows 10 auswählen dann
Registerkarte Trigger: Neu -> Auswahl: Bei Anmeldung -dann
Registerkarte Aktionen: Neu -> Auswahl: Programm starten; Eingabefeld Programm/Skript: %windir%\System32\WindowsPowerShell\v1.0\powershell.exe
Eingabefeld Argumente hinzufügen: -WindowStyle hidden -command "C:\Users\USERNAME\documents\spoolctl.ps1" ->
und speichern. USERNAME muss natürlich durch den Namen des Benutzers ersetzt werden. Der steht immer am Prompt der powershell-Konsole.
Nach einem Neustart sollte das Skript automatisch geladen werden.
Ich hoffe es funktioniert genauso gut wie bei mir:-).
Noch ein Hinweis: Sollten Druckjobs, aus welchen Gründen auch immer, in der Warteschlange herumhängen, wird der Drucker immer angeschaltet werden. Haltet also eure Druckerwartshlange sauber.