BUG ??? TIDY - WMI - OBJ/COM

  • Hi Leute,
    ich nenne es schon eine "Welle an Misserfolg", mal wieder Problem, diesmal mit "TIDY - WMI - OBJ/COM"
    Da ich Paar Funktionen fuer den Drucker-Managment sammle, wollte ich mir was ueber WMI zusammenschustern. (Es gibt da so wenig UDF's :whistling: )

    1.Problem: Kein ---> SyntaxCheckProd ausgefuehrt, keine Fehler
    2.Problem: TIDY ausgefuehrt, es werden Fehler angezeigt, in Zeile 22 wird das UnderScore mit Leerzeichen versetzt, der Unterstrich ist aber kein Zeilenumbruch in Scite, sondern gehoert zu dem Befehl.
    3.Problem: Das Script wird zwar ausgefuehrt und bringt die Aktion zu Ende, aber nur einmal, danach schiesst sich das Objekt aber ab.
    4.Problem: Kann das Script nicht ueber das Systray beenden (Das ist aber fast kein Problem)

    Ich keine Ahnung warum, muss deshalb hier Fragen :rolleyes:
    Code im Spoiler:

    Spoiler anzeigen
    [autoit]


    ;Ueberfacht den DruckerJob, wenn die zu druckende Seitenanzahl hoeher als die Vorgabe ist, wird der Druckauftrag abgebrochen und der Spooler geleert
    $maxPages = 2 ; Limit der Seiten

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService = ObjGet("winmgmts:\\.\root\cimv2")

    [/autoit] [autoit][/autoit] [autoit]

    $Wql = ("Select * from __InstanceOperationEvent within 1 where TargetInstance isa 'Win32_PrintJob'and TargetInstance.totalpages >" & $maxPages)

    [/autoit] [autoit][/autoit] [autoit]

    $colEvents = $objWMIService.ExecNotificationQuery($Wql)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("!========================================================" & @CRLF)
    ConsoleWrite("Drucker wird ueberwacht")
    ConsoleWrite("!========================================================" & @CRLF)
    While 1
    ;Sleep(100)
    $objEvent = $colEvents.NextEvent

    [/autoit] [autoit][/autoit] [autoit]

    With $objEvent.TargetInstance
    ConsoleWrite("!========================================================" & @CRLF)
    ConsoleWrite(.document & "auf" & .name & " geleoscht " & .totalpages & " Limit " & $maxPages & @CRLF)
    ConsoleWrite("!========================================================" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    .Delete_; Hier Underscore Problem mit TIDY

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("!========================================================" & @CRLF)
    ConsoleWrite(" Drucken beendet " & @CRLF)
    ConsoleWrite("!========================================================" & @CRLF)
    EndWith

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit]

    - MfG OpaEd

    3 Mal editiert, zuletzt von opaed (13. Mai 2010 um 00:13)

  • Habe das mal mit nem Script von mir angepasst :)

    Spoiler anzeigen
    [autoit]

    Opt("TrayAutoPause",0)

    [/autoit] [autoit][/autoit] [autoit]

    Dim Const $wbemFlagReturnImmediately = 0x10
    Dim Const $wbemFlagForwardOnly = 0x20
    Dim $sComputer = "."

    [/autoit] [autoit][/autoit] [autoit]

    $WMIConnect = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sComputer & "\root\CIMV2")
    If Not @error Then
    While Sleep(100)
    $oList = $WMIConnect.ExecQuery("select * from Win32_PrintJob WHERE TotalPages >= 1", 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    For $oItem In $oList
    ConsoleWrite("Maximale Seitenanzahl überschritten" & @CRLF & "Job ID: " & $oItem.JobId & @CRLF & "Dokument: " & $oItem.Document & @CRLF & "Drucker: " & $oItem.Name & @CRLF & "Benutzer: " & $oItem.Owner & @CRLF & "Seitenanzahl: " & $oItem.TotalPages & @CRLF)
    $oItem.Delete_
    Next
    WEnd
    EndIf

    [/autoit]

    So funktioniert es
    Habe es aber nur lokal auf nem PDF Drucker getestet ^^

    ----------------

    Ok es scheint noch ein anderes Problem zu geben, kenne die Ursache aber noch keine Lösung :S

    http://msdn.microsoft.com/en-us/library/aa394370(VS.85).aspx
    TotalPages gibt 0 zurück, wenn keine Gesamtanzahl übergeben wird.

    Siehe Konsolenausgabe

    Spoiler anzeigen

    Das geschieht unglücklicherweise aber bei mehreren Programmen (Notepad, Open Office...), mit der Windows Testseite hat es wunderbar geklappt

    21 is only half the truth.

    3 Mal editiert, zuletzt von Mahagon (14. Mai 2010 um 21:38)

  • Hi Mahagon,
    danke für deine Lösung, works :thumbup:

    Mich würde trotzdem interessieren warum die 1:1 Übersetzung von VBS zu Autoit nicht funktioniert hat, warum TIDY bei der Übersetzung verrückt spielt und warum Delete_ ausgeführt wird und dann ein Error meldet :?:

    Zitat

    Ok es scheint noch ein anderes Problem zu geben, kenne die Ursache aber noch keine Lösung :S
    TotalPages gibt 0 zurück, wenn keine Gesamtanzahl übergeben wird.

    Verstehe nicht so ganz, was damit gemeint ist ???
    Im Momoment sehe ich das Problem nicht wirklich. Was meinst du der Angabe der Gesamtanzahl ???

    [autoit]

    $oList = $WMIConnect.ExecQuery("select * from Win32_PrintJob WHERE TotalPages >= 1"; <---$MaxPages gibst du hier an, wird gebraucht für den Vergleich.

    [/autoit]

    PS. Die Idee mit der WMI-Erweiterung finde ich gut, es gibt zwar den ScriptOmatic, der deckt aber nicht alles ab und ist auch keine UDF :thumbup:

    - MfG OpaEd

  • Nene.. wenn du mal bei Kleinweich in der Klasse schaust siehst du, das die selbst dieses "Problem" kennen/verursacht haben.
    habe daheim OpenOffice und wenn ich da z.B. ein 100 Seitiges Dokument drucke, wird anscheinend MaxPages nicht übergeben (bleibt also 0), wodurch das Script nicht funktioniert.

    21 is only half the truth.

  • Hi Mahagon.D

    Zitat

    Nene.. wenn du mal bei Kleinweich in der Klasse schaust siehst du, das die selbst dieses "Problem" kennen/verursacht haben

    Ich nehme an, du meinst das von Kleinweich:
    Win32_PrintJob Class
    TotalPages Data type: uint32Access type: Read-only
    Number of pages required to complete the job. This value may be 0 (zero) if the print job does not contain page-delimiting information.
    Als Uebersetzung kommt bei mir folgendes raus:
    Anzahl der Seiten erforderlich, um den Auftrag abzuschließen. Dieser Wert kann 0 (Null) sein, wenn der Druckauftrag keine Informationen ueber die Seitenbegrenzung (Seitenanzahl) enthält.
    Schlau macht mich das nicht besonders:
    Aus dem obigen Satz kann ich nicht erkennen ob die Eigenschaft .TotalPages oder die Variable $MaxPages den Fehler verursachen kann, deshalb gruebel. 8|

    Zitat

    habe daheim OpenOffice und wenn ich da z.B. ein 100 Seitiges Dokument drucke, wird anscheinend MaxPages nicht übergeben (bleibt also 0), wodurch das Script nicht funktioniert.

    Ich muss das mal bei Gelegenheit mit OpenOffice testen, mit Notepad hat deine Loesung funktioniert, allerdings mit einer kleinen Seitanzahl und unter XP getestet.
    Eigentlich duerfte das nicht passieren, echt aergerlich, genau wie mit der PRNADMIN.DLL, die den STATUS des Druckers nicht zurueckliefert.

    - MfG OpaEd

  • hmm.. ich hab mal das Script für x86 compiliert... nu gehts o0
    Merkwürdige Sache... Naja es scheint das es irgendwie mit x64 zusammenhängt.

    21 is only half the truth.