Drucker managen per autoit

    • [ offen ]

      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
      msdn.microsoft.com/en-us/library/dd162861%28v=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.
      UDFs:
      Active Directory (2014-07-21 - Version 1.4.1.1) - Download - Support - Example Scripts - Wiki
      OutlookEX (2014-07-27 - Version 1.0.0.0) - Download - Support - Example Scripts - Wiki
      ExcelChart (2013-01-21 - Version 0.3.1.1) - Download
      Excel - Example Scripts - Wiki
      Word - Wiki
      Tutorials:
      ADO - Wiki

      water schrieb:

      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-Quellcode

      1. Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
      2. ; Dein Code kommt hierhin
      3. ; User's COM error function. Will be called if COM error
      4. occurs
      5. Func _ErrFunc($oError)
      6. ; Do anything here.
      7. ConsoleWrite("err.number is: "
      8. & @TAB & $oError.number & @CRLF & _
      9. "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
      10. "err.description is: " & @TAB & $oError.description & @CRLF & _
      11. "err.source is: " & @TAB & $oError.source & @CRLF & _
      12. "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
      13. "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
      14. "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
      15. "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
      16. "err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
      17. EndFunc ;==>_ErrFunc
      UDFs:
      Active Directory (2014-07-21 - Version 1.4.1.1) - Download - Support - Example Scripts - Wiki
      OutlookEX (2014-07-27 - Version 1.0.0.0) - Download - Support - Example Scripts - Wiki
      ExcelChart (2013-01-21 - Version 0.3.1.1) - Download
      Excel - Example Scripts - Wiki
      Word - Wiki
      Tutorials:
      ADO - Wiki
      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?
      UDFs:
      Active Directory (2014-07-21 - Version 1.4.1.1) - Download - Support - Example Scripts - Wiki
      OutlookEX (2014-07-27 - Version 1.0.0.0) - Download - Support - Example Scripts - Wiki
      ExcelChart (2013-01-21 - Version 0.3.1.1) - Download
      Excel - Example Scripts - Wiki
      Word - Wiki
      Tutorials:
      ADO - Wiki
      Ich habe
      activexperts.com/activmonitor/…scripts/printing/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

      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

      autoitscript.com/forum/topic/9…e-vbs-into-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.
      UDFs:
      Active Directory (2014-07-21 - Version 1.4.1.1) - Download - Support - Example Scripts - Wiki
      OutlookEX (2014-07-27 - Version 1.0.0.0) - Download - Support - Example Scripts - Wiki
      ExcelChart (2013-01-21 - Version 0.3.1.1) - Download
      Excel - Example Scripts - Wiki
      Word - Wiki
      Tutorials:
      ADO - Wiki
    autoit.de Webutation