Drucker managen per autoit

  • Hallo,

    folgendes würde ich gerne machen:
    Während mein script läuft, soll kein Druckauftrag eines anderen programmes ausgeführt werden. Stattdessen sollen die Druckauftrage in Dateien landen.
    Anhand der Dateien erkenne ich ja welche Aufträge es gibt, nun will ich einfach nur die Reihenfolge ändern. und sobald ich will sollen die dateien ausgedruckt werden.(einfache cmd line)

    So weit bin ich bisher gekommen:
    Ich weis das sowieso alle druckaufträge erst in Dateien gesammelt werden unter
    C:\Windows\System32\spool\PRINTERS
    Natürlich wäre es schöner wenn ich in meinem Programm die namen und den ort selber entscheiden könnte, aber notfalls würde dies ja gehen.

    Schalte ich den Drucker pyhsikalisch aus, werden alle aufträge in dem ordner gesammelt, mache ich ihn an geht das drucken los. Das meiste meines Programmes ist also bereits windows intern geklärt, jedoch sind es die feinheiten.
    Ich will nicht die ganze zeit den drucker an und aus machen, und die reihenfolge lässt sich auch nicht wirklich ändern. (Könnte ich alle druckaufträge in eigenen dateien umleiten wäre die reihenfolge kein problem da ich sie dann ja in gewünschter reihenfolge in die spool legen könnte)

    Ich hab dann
    http://msdn.microsoft.com/en-us/library/…v=VS.85%29.aspx
    gefunden, werde daraus jedoch nicht schlau, leider finde ich auch kein code beispiel für autoit welches mit der spool api arbeitet sodass ich daran etwas lernen kann und dann per trial and error mich langsam vortasten kann.

    Nochmal kurz:
    Druckaufträge umleiten(in datei)
    Druckaufträge neu sortieren
    Auf wunsch ausdrucken


    Kann mir da jemand helfen? geht das mit autoit oder sollte ich doch eine andere sprache wählen?

    Vielen dank im vorraus

  • Danke, das hat mir sehr geholfen, habe nun aber ein problem mit dem Setzen von eigenschaften
    Das VB script sieht so aus:

    objPrintJob.Put "Priority" , 2
    objPrintJob.SetInfo

    Das SetInfo ist das problem, das kann ich nicht in Autoit sprache umwandeln

    objPrintJob.Priority = 2 ;geht einwandfrei
    objPrintJob.SetInfo ;geht nicht


    wie ist der Autoit befehl dafür?

  • objPrintJob.Put("Priority", 2)
    objPrintJob.SetInfo

    Wenn's dann immer noch klemmt, dann brauchst Du einen COM error handler um die Details des Problemes abzufragen.

  • objPrintJob.Put("Priority", 2)
    objPrintJob.SetInfo

    Wenn's dann immer noch klemmt, dann brauchst Du einen COM error handler um die Details des Problemes abzufragen.

    Das habe ich ja ausprobiert, geht aber nicht

    Anstatt
    $objPrinter.Put("Priority", 2)

    zu schreiben muss man
    $objPrinter.Priority = 2
    schreiben.

    Leider weis ich nicht wie man die SetInfo funktion nutzt(im moment ist es ja nur auf meinem PC so gesetzt, nun muss ich dem Drucker das ja zurückschicken)

    Und dein COM error handler sagt mir nun leider nichts.

    Als fehler bekomme ich bei der SetInfo:
    The requested action with this object has failed.:
    $objPrinter.SetInfo
    $objPrinter.SetInfo^ ERROR

  • Hab es nun auch mal mit der anderen variante probiert und den Printojb direkt eine Priorität geben wollen, aber das geht auch nicht

    objPrinter.Priority = 2
    objPrinter.Put_

    WIeder kann ich die priorität setzen, aber den Put_befehl kann er nicht ausführen.

    Da muss es doch eine dokumentation geben wie man das mit autoit hinbekommt

  • Das sieht nach WMI Objekten aus. Dieses Beispiel verwendet Put ind SetInfo so wie ich es vorgeschlagen habe.
    Den COM Error Handler findest Du beim Befehl ObEvent.

    [autoit]

    Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
    ; Dein Code kommt hierhin
    ; User's COM error function. Will be called if COM error
    occurs
    Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite("err.number is: "
    & @TAB & $oError.number & @CRLF & _
    "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
    "err.description is: " & @TAB & $oError.description & @CRLF & _
    "err.source is: " & @TAB & $oError.source & @CRLF & _

    "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
    "err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
    EndFunc ;==>_ErrFunc

    [/autoit]
  • Ok danke, hab es nun so angepasst, hier der Quellcode

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

    Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")

    $strComputer = "."
    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
    $colPrintJobs = $objWMIService.ExecQuery ("Select * from Win32_PrintJob")
    For $objPrintJob in $colPrintJobs
    $objPrintJob.Put("Priority", 2)
    $objPrintJob.SetInfo()
    Next


    ; User's COM error function. Will be called if COM error occurs
    Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite("err.number is: "& @TAB & $oError.number & @CRLF & _
    "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
    "err.description is: " & @TAB & $oError.description & @CRLF & _
    "err.source is: " & @TAB & $oError.source & @CRLF & _
    "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
    "err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
    EndFunc ;==>_ErrFunc

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

    Und hier die Fehler Meldung

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

    err.number is: -2147352570
    err.windescription: Unbekannter Name.

    err.description is:
    err.source is:
    err.helpfile is:
    err.helpcontext is: 0
    err.lastdllerror is: 0
    err.scriptline is: 7
    err.retcode is: 0

    err.number is: -2147352570
    err.windescription: Unbekannter Name.

    err.description is:
    err.source is:
    err.helpfile is:
    err.helpcontext is: 0
    err.lastdllerror is: 0
    err.scriptline is: 8
    err.retcode is: 0

    err.number is: -2147352570
    err.windescription: Unbekannter Name.

    err.description is:
    err.source is:
    err.helpfile is:
    err.helpcontext is: 0
    err.lastdllerror is: 0
    err.scriptline is: 7
    err.retcode is: 0

    err.number is: -2147352570
    err.windescription: Unbekannter Name.

    err.description is:
    err.source is:
    err.helpfile is:
    err.helpcontext is: 0
    err.lastdllerror is: 0
    err.scriptline is: 8
    err.retcode is: 0

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

  • Die WMI Klasse Win32_PrintJob findest Du hier.
    Hier habe ich einen Hinweis gefunden, dass sich die Priorität mit WMI nicht ändern lässt.
    Bist Du sicher, dass das geht?

  • Ich habe
    http://www.activexperts.com/activmonitor/w…inting/servers/

    das als vorbild genommen und dort gibt es code snippets die ich einfach umbauen wollte.

    ich muss ja nur die priorität der printjobs ändern, und wenn ich mir

    http://technet.microsoft.com/en-us/library/ee176752.aspx

    ansehe, ist dort kein "Read only" bei priorität, also gehe ich davon aus das es geht. vor allem da ja meine lösung mit

    $objPrintJob.Priority = 2

    während

    $objPrintJob.Put("Priority", 2)

    nicht geht, zeigt mir das es eigentlich gehen sollte, nur die sets funktion scheint problematisch.


    Ich habe dann mal geschaut ob es eine möglichkeit gibt ein vba script direkt durch autoit auszuführen, das muss es wohl auch geben, aber da bekomme ich es auch nicht zum laufen

    http://www.autoitscript.com/forum/topic/98…-autoit-script/


    Ich dachte eigentlich nicht das es so schwer ist die priorität zu ändern, weil stoppen weitermachen alles löschen und so kann ich am drucker, nur eben die eigenschaften machen probleme weil der set/put befehl nicht geht

  • Das Beispiel auf das Du verlinkst verwendet aber den WinNT Provider, während Du den WMI Provider ansprichst, der scheinbar nicht erlaubt die Priorität zu ändern.