Page 1 of 1

Druckerstatus abfragen

Posted: 26 Oct 2019, 06:11
by moefr01
Dank jNizMs WMI-Snippets habe ich eine Abfrage für den On/Offline-Status eines Systemdruckers erstellt. Einfach den abzufragenden Druckernamen in der ersten Zeile anpassen und schon erhält man die gewünschte Info. Ich war auf der Suche nach einer ebenbürdigen Lösung, fand aber nur umständliche Scripte mit Auslagerung in eine Datei, was bei einer intervallierten Abfrage meine SSD zu sehr forderte.
Viel Spaß... :wave: moefr01

Code: Select all

printername := "your printername here"
var := printerstatus()
if var[1] = printername {
   if var[2] = 0
	  status := "online"
   else
	  status := "offline"
}
else Return
msgbox, % "Printer " printername " is " status "."
ExitApp

;;;;;;;;;;;;;;;;;; function: printerstatus()     var[1] = printername     var[2] = workoffline (-1/0)
printerstatus()
    {
    for objItem in ComObjGet("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_Printer",,48)
        return, % { 1 : (objItem.Name), 2 : (objItem.WorkOffline)}
    }

Re: Druckerstatus abfragen

Posted: 08 Jan 2020, 05:27
by garry
danke moefr01
EDIT : angepasst mit script von user 'haichen'
ich habe manchmal ein Problem dass der Drucker Offline anzeigt ( obwohl an) und mit 'Problembehandlung' denn funktioniert
wenn offline > run control printers , denn mit Rechtsklick > 'Problembehandlung'

Code: Select all

;- modified : user 'haichen'
Defaultprinter :=GetDefaultPrinter()
status := printerstatus(Defaultprinter)  ;0/1
if (status<>"")
	msgbox, % Defaultprinter " ist " (status ? "an" : "aus") 
else
   {
   msgbox, % Defaultprinter " gibt es nicht"
   exitapp
   }
;----------------
if (status="0")
  {
  run,control printers
  msgbox, 262208,,YOUR default PRINTER:`n%Defaultprinter%`n`nis OFF-LINE`n------------`nSwitch ON the printer`nIf problem : With Rightclick start > 'Problembehandlung'
  exitapp
  }
else
  msgbox, 262208, ,YOUR default PRINTER:`n%Defaultprinter%`n`nis ON-LINE
ExitApp
;----------------
GetDefaultPrinter()
{
	If A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME
		RegRead, var, HKLM\Config\0001\System\CurrentControlSet\Control\Print\Printers, Default
	Else
		RegRead, var, HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
	StringSplit,var, var, `,
	return var1
}
;----------------
printerstatus(pn)
{
	for objItem in ComObjGet("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_Printer where Name='" pn "'",,48)
		return, objItem.WorkOffline+1  ;workoffline (-1/0) -> mit +1 erhalte ich 0 für offline und 1 für online
}
;==============================================

Re: Druckerstatus abfragen

Posted: 08 Jan 2020, 07:02
by haichen
Bei mir funktioniert das leider so nicht. In der If-Abfrage ist ein Fehler. Der status wird nur gesetzt, wenn der Printername = Var[1] ist, anderenfalls ist der status ungesetzt. Das klappt vermutlich nur, wenn der Drucker als letzter in der Liste steht. Die Idee ist klasse.

Ich hab das mal umgeschrieben und hoffe, dass der Code so korrekt ist:

Code: Select all

Defaultprinter :=GetDefaultPrinter()
status := printerstatus(Defaultprinter)  ;0/1
if (status<>"")
	msgbox, % Defaultprinter " ist " (status ? "an" : "aus") 
else
	msgbox, % Defaultprinter " gibt es nicht"

ExitApp


GetDefaultPrinter()
{
	If A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME
		RegRead, var, HKLM\Config\0001\System\CurrentControlSet\Control\Print\Printers, Default
	Else
		RegRead, var, HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
	StringSplit,var, var, `,
	return var1
}

printerstatus(pn)
{
	for objItem in ComObjGet("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_Printer where Name='" pn "'",,48)
		return, objItem.WorkOffline+1  ;workoffline (-1/0) -> mit +1 erhalte ich 0 für offline und 1 für online
}
Änderung: Wenn es den Drucker nicht gibt ist der status ungesetzt. Habe ich noch geändert.

Re: Druckerstatus abfragen

Posted: 08 Jan 2020, 07:26
by haichen
Änderung: Wenn es den Drucker nicht gibt ist der status ungesetzt. Habe ich noch geändert.