1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. rose0805

Beiträge von rose0805

  • Skript funktioniert nur Teilweise, wenn nicht angemeldet

    • rose0805
    • 8. Juni 2015 um 10:00

    Hallo Peter.

    Das ich das so mache hat verschiedene Gründe.
    Z.B. Unwissenheit ;) . Vielleicht dürfte ich mir Deinen Script abkupfern ?!

    Dann wären da, was für mich doch wichtig ist, die Zeitnahe Verarbeitung, und vtl. die Masse.
    Die PDF Dateien kommen von einem Dokumentenscanner aus dem Ausland, und da kann das zack zack zack gehen.

    Mit dem Attribut, oder ich hätte gedacht häng noch etwas an den Dateinamen dran, ist auch eine gute Idee.
    Aber soweit "war" ich noch nicht, da der Druck ja nicht zuverlässig rauskam. (Ich bin noch in der Testphase, aber meine Abwandlungen scheinen jetzt zu greifen, nachdem ich das auf verschiedene Ordner verteile, das geht jetzt live...)
    Und das mit dem Protokollfile ist ja schon drin. Da steht aber auch was drin, obwohl es nicht funktioniert hat..pfff.
    Hilfreich bei der Analyse wäre noch gewesen, dass die Dateigröße in das Logfile reingeschrieben wird, aber das krieg ich nicht hin.

    Wie das so ist, bin ich natürlich dafür, möglichst kein XP oder eine physische Maschine mehr einzusetzen. Hin oder her, das ist alte Technik. Und da ich genug alte Technik habe möcht ich das nicht mehr. Ich möchte das Thema Druck auch abschließen, und dann lange vergessen :whistling:

    Ich hatte vor einiger Zeit einen anderen Forumsbeitrg verfasst, in dem es darum ging, so einen Script als Dienst zu starten. Das mit dem Dienst hat leider nicht funktioniert, weil Fehlermeldungen beim Dienststart kamen.
    Deshalb bin ich auf die Variante gegangen, dass das Programm als Prozess läuft.
    In dem Forumseintrag hat jemand geantwortet, das ich in dem Script API verwenden soll.
    In dem Beispiel ging das darum, dass wenn eine Datei kommt (gespeichert wird), nur die genommen und verarbeitet wird. Das würde Deine 10 min Wartezeit zum Beipsiel überflüssig machen. ABER, unter Win2003 32Bit lief dieser Script nicht. Die API Funktion hat nicht gearbeitet.
    Jetzt könnte ich die beiden Scripts natürlich mischen und testen, weil ich jetzt eine Win7 VM benutze und das da funktioniert, aber das alt bewährte funktioniert jetzt, es ist für andere vom Ablauf verständlich, und ...

    es war nicht teil meiner gestellten Frage :D
    (Man kann sich alles schönreden)

  • Skript funktioniert nur Teilweise, wenn nicht angemeldet

    • rose0805
    • 3. Juni 2015 um 11:31

    Hallo.
    Vielen Dank für die Beiträge.
    Ich hab im Moment wenig Zeit auszuprobieren, aber ich werde das aufnehmen.

    @gnmg, das mit den Verzeichnissen kann man eleganter mit einer IF machen, ja, aber ich muss gestehen, ob der den Befehl mehrfach ausführt oder nicht spielt für mich performancemäßig keine Rolle.
    Und für mich gehört das in die Schleife, weil der AutoIT-Job ja immer laufen sollte, und die Verzeichnisse sollen IMMER zur Verfügung stehen (auch wenn man das mit Rechtevergaben lösen kann) .
    Das mit dem "\" hat nichts bewegt. Auch wenn es fehlerhaft ist, es funktioniert mit und ohne!?!


    @Peter S. Taler, das hört sich sogar sehr plausibel an!!! Nach dieser Logik gehe ich sogar davon aus, dass es egal ist, welchen Drucker ich in die Befehlszeile knalle. Da ich schon viiiiele Sachen probiert habe glaub ich, dass ich das gar nicht erst testen muss.
    >> Danke für die Erklärung!

    Eigentlich wäre das sogar ein Fall für AutoIT als Dienst... aber da scheint es ja keine zuverlässige Lösung zu geben. Da habe ich die Suche aufgegeben.

    Dies würde auch bestätigen, warum das jetzt mit der virtuellen Win7 Maschine geht, die immer angemeldet ist. Mit dieser eigentlichen Behelfslösung funktioniert es relativ gut.

    Relativ, weil ich wahrscheinlich noch ein MS Problem habe.
    Die Dateien werden vom/im Ausland auf unserem Server gespeichert. Auch wenn wir eine schnelle Internetverbindung haben, dauert es eine gewisse Zeit, bis MB Große Dateien "fertig" gespeichert sind.
    Aber, für das Script ist der Dateiname schon greifbar, MS kann sie aber noch nichts damit anfangen = Druck kommt nicht raus, und nach dem Sleep wird die Datei verschoben (weil in der Zwischenzeit vielleicht fertig).
    Das werde ich versuchen zu lösen, in dem ich einen weiteren Ablageort anlege, aus der heraus die Verarbeitung stattfindet, mit dem Hintergrund, das noch nicht fertig gespeicherte Dateien gesperrt und nicht kopiert werden können ;)
    Es wird Zeit für neue Server. Das Win2003 geht mir so langsam auf die Knispel.

  • Skript funktioniert nur Teilweise, wenn nicht angemeldet

    • rose0805
    • 28. Mai 2015 um 08:52

    Hallo Peter.
    Drucker, Script und AutoIt sind auf einem Win2003 Server (mein Printserver) lokal installiert.
    Was Sumatra betrifft weiß ich nun wirklich nicht was Du meinst.

    Das Programm startet und verarbeitet die Datei, das es als Parameter mitbekommt?!
    $sP1 = Drucker
    $pdffile = File

    Code
    RunWait('"' & $program & '\SumatraPDF.exe" -print-to '& $P1 &' -silent -exit-when-done "' & $sP1 & '\' & $pdffile & '"')


    So wie Du es beschriebst mache ich es auch.
    Ablauf:
    - Das Script schaut ist eine Datei da.
    - Setze den Standarddrucker (im o.g. Script ein Überbleibsel)
    - Wenn Ja fang an und füll das Logfile mit Datum und Uhrzeit, dann warte einen Moment um sicher zu gehen, dass die Dateispeicherung fertig ist (sleep).
    >>Dann Übergabe an Sumatra, Druckjob.
    - Wieder einen Moment warten, DOS Batch starten und BLAT verschickt eine EMail.
    - Wieder einen Moment warten und die Datei in ein Archiv verschieben.
    - Währenddessen immer mal wieder was ins Logfile schreiben um die Zeiten zu kontrollieren.

    Das Skript arbeitet vollständig druch. Auch im abgemeldeten Zustand.
    Logfile wird geschrieben, der ganze Prozess protokolliert.
    Auch die EMail wird mit dem PDF File als Anhang verschickt. Und auch das Verschieben der Datei funktioniert.
    >>ABER es kommt kein Druckjob aus dem Drucker raus. Der Output fehlt!
    UND das ist der Unterschied zum angemeldeten Zustand, da funktioniert auch der Druck.

    D.h. das Arbeitsverzeichnis brauche ich nicht. Was an dem Tag verarbeitet wird sehe ich am Datum oder im täglichen Logfile.
    Das Verschieben/Verarbeiten funktioniert ja korrekt.

  • Skript funktioniert nur Teilweise, wenn nicht angemeldet

    • rose0805
    • 27. Mai 2015 um 13:55
    Zitat von bernd670

    Hallo,

    auf welche Art wird den dein Programm gestartet und unter welchem Nutzer wird es gestartet?
    Das hört sich fast so an als wenn bei dem Nutzer unter dem das Programm läuft kein Drucker zur Verfügung steht.

    Ein kleiner Tipp zum Logging:
    Wenn man das Datum in der Reihenfolge

    [autoit]

    "G:\Temp\_" & @YEAR & "_" & @MON & "_" & @MDAY & "_" & "Verarbeitung.txt"

    [/autoit]

    zusammensetzt, dann sind die Logfiles immer schön chronologisch geordnet.

    Guten Tag.
    Also ich mach aus dem Script eine .exe und führe die als Administrator auf dem "Print"-Server aus.
    Zusäztlich hab ich eine Batch im Task Planer und in der Autostart, der prüft ob der Prozess aktiv ist, und wenn nicht wird der automatisch gestartet.
    Die Drucker sind lokal installiert. Theroretisch sollten die auch im abgemeldeten Zustand erreichbar sein :D .


    Zitat von Peter S. Taler

    Also ich habe so etwas ähnliches am laufen. Ich rufe aus autoIT via run sumatra mit Befehlen auf > funktioniert seit Jahren.

    Mit run sollte der Aufruf von Sumatra und Parametrübergabe funktionieren
    Wenn nicht - dos scribt mit den nötigen sumatra aufrufen und scribt aus autoit starten

    Ev. mal probieren das Autoit Scribt als service laufen zu lassen


    Gruß

    Peter

    Alles anzeigen

    Auch ein freundliches Hallo.
    Das funktioniert auch super mit Sumatra. Es macht mich mittlerweile nur wahnsinnig, dass das nur zu 100% läuft wenn ich auf den Bildschirm gucke, und bei dem Prozess zugucke 8o .

    Das mit der DOS Variante porbier ich auch mal.
    Wenn ich nicht weiterkomme mach ich sowieso alles in DOS :cursing: . Leider kann ich im Taskplaner den Intervall nur auf 1 Minute stellen. In der Zeit kann schon der nächste eine neue PDF hinzugefügt haben und dann rutscht was durch.


    Als Service bekomm ich das nicht registiert, bzw. läuft dann gar nicht.

  • Skript funktioniert nur Teilweise, wenn nicht angemeldet

    • rose0805
    • 22. Mai 2015 um 09:57

    Guten Morgen.

    Vielen Dank für den Tipp mit dem Datum. Klappt soweit. *freu*

    Was die Parameter angeht:
    Ich hab Sumatra ohne die Parameter gestartet. Mich abgemeldet, mich wieder angemeldet, und es kam aber keine Meldung, und wie gehabt der Druck kam auch nicht raus.

    Aber da ich ein skeptischer Mendsch bin hab ich den String unter DOS mal ausprobiert... und da hat die Software sofort gedruckt...
    ... auch ohne Meldung(en), ohne dass sich die Software öffnet!
    Mit der Option -print-dialog kann ich wohl erzwingen, das die Drucker auswahl angezeigt wird, aber auch das wird nicht angezeigt, wenn ich den Drucker gleich mitgebe.

    Also das da eine Fehlermeldung vom Sumatra im Hintergrund kommt schließe ich jetzt mal aus.

    Danke für die Idee.

    Zitat von Peter S. Taler

    Erst mal eine Rückfrage - Drucken auf PDF Drucker funktioniert zu Deiner Zufriedenheit? Nur drucken auf echten Drucker nicht?

    Hallo.

    Ich drucke ja nicht auf einem Software PDF Drucker.
    Ich nehme eine beliebige PDF Datei, die schiebe ich in ein Verzeichnis, und das PDF Programm druckt die Datei auf einem Laserdrucker aus.
    Das klappt wunderbar... nur eben nur solange ich angemeldet bin.

    Kurzes Feedback.

    Ich habe das Script nun auf einen Win7 64Bit System gelegt, den ich per TermService (mehrere Anmeldungen) steuern kann.
    Versteckt im Hintergrund lasse ich den Job unter einem anderen User laufen, und schließe die RDP Session mit dem X in der Fensterecke.
    Jedenfalls funktioniert es jetzt. Der Druck kommt raus.
    Für mich jetzt Nachteilhaft, weil ich nehm eine Extra Maschine, und ich muss die Druckertreiber installieren die ich brauche.

  • Skript funktioniert nur Teilweise, wenn nicht angemeldet

    • rose0805
    • 21. Mai 2015 um 13:07

    Das mit dem Standarddrucker muss ein Überbleibsel durch die viiiiiiielen Versuche sein.
    Du hast Recht. Braucht man nicht.
    Bevor ich mich jetzt mit noch einem anderen Programm rumschlage warte ich erstmal ab ob noch jemand eine Idee hat.
    Ich glaube eher, dass das Programm den nötigen Schubser nicht bekommt, dass es was machen soll.
    Vielleicht fehlen im Scriptkopf irgendwelche Parameter die nötig sind odes sowas...
    Danke

  • Skript funktioniert nur Teilweise, wenn nicht angemeldet

    • rose0805
    • 21. Mai 2015 um 12:32

    Hallo Forum.

    Ich arbeite gerade als Anfänger an einem Skript, das ein Verzeichnis auf Dateieingang prüft, die Datei druckt, dann wird noch eine Kontroll EMail verschickt, und die Datei wird anschließend in ein Archiv verschoben.
    Nicht lachen, ich hab mir alles zusammengeklaubt was ich finden konnte.

    Unabhängig vom Skript, ob der soooo Sinn macht oder verbessert werden könnte
    (PS: Läuft auf einem Win2003 Server. Und mit API Funktionen funktioniert nicht alles)...
    und ich weiß, ich hab da noch Fehler drin (z.B. das Datum der Logdatei aktualisiert sich nicht), ...
    bin ich zu unerfahren um mein Problem selbst zu lösen.
    Try und Error funktioniert halt nicht immer und Onkel Google weiß ich nicht was ich fragen soll :P

    Das Problem liegt darin, dass das Script im Hintergrund, bei Nicht-Anmeldung am Server zwar arbeitet, aber nicht druckt. Also seinen Hauptzweck nicht erfüllt.
    Log wird geschrieben (ich hab es etwas ausführlicher gemacht, um rauszufinden woran das liegen könnte), EMail wird versendet und die Datei verschoben,
    ABER es kommt nichts aus dem Drucker raus. Der Job wird nicht übergeben.

    Melde ich mich an, z.B. über RDP, funktioniert der Script so wie er jetzt ist (natürlich mit den beschriebenen Fehlern im zweiten Absatz) korrekt.

    Auf dem Drucker hat Jeder das Recht zu drucken.
    Das PDF Programm funktioniert ja auch so in der Form. An den Parametern liegt es nicht.

    >> Hat jemand einen Tipp oder ein Stichwort zum googlen? ;(

    Der Wurm kann nach meinem Verständnis nur in Zeile 100 liegen. Der Programmaufruf vom PDF Programm klappt nach der Abmeldung vielleicht nicht mehr.

    Mit anderen PDF Programmen habe ich getestet. Die zerhauen mir aber die Formate oder drucken nicht im Hintergrund. Und schließen tun sie sich auch nicht automatisch und der Script läuft nicht weiter.

    Code
    ;#NoTrayIcon
    
    
    #RequireAdmin
    
    
    ; Hier kannst du einen Hotkey zum Beenden des Programms festlegen
    ; in Anführungszeichen vorm Komma, z. Z. ALT+SHIFT+Q
    HotKeySet("+!q", "Quit")
    
    
    ;Anpassungen
    
    
    $status = DriveStatus( "G:" )
    If $status = "INVALID" Then
    DriveMapAdd("G:", "\\IPAdresse\Gruppen", 0,"adminuser@domain","passwort")
    EndIf
    
    
    
    
    ;Pfad zu PDF Viewer
    $program = "C:\Programme\SumatraPDF"
    
    
    $date = StringFormat("%02d",@MDAY) & "_" & @MON & "_" & @YEAR
    $logfile="G:\Temp\_" & $date & "_" & "Verarbeitung.txt"
    
    
    
    
    $pathtosetdefaultprinter = "c:\AutoIt\Program"
    $standardprinter = "P040"
    
    
    $P1 = "P153"
    
    
    ; Pfad der auf neue Dateien überwacht werden soll (Freigabename)
    ; Recht muss vorhanden sein
    $source = "G:\LSScan\"
    
    
    
    
    $sP1 = $source
    
    
    ; Pfad, in den die Dateien nach dem Drucken verschoben werden sollen
    $dest = "G:\_Archiv\"
    
    
    
    
    ; Pruefintervall des Scripts nach vollstaendigem Abschluss in Millisekunden (10 Sek = 10000)
    $interval = 20000
    
    
    
    
    
    
    
    
    
    
    ;-----Script Start-------------------------------------
    
    
    While 1
     Sleep($interval)
    
    
     ; Druckverzeichnisse für jeden Drucker erstellen, damit der User dort die Dateien
     ; ablegen kann. Falls das Verzeichnis aus versehen gelöscht wird,
     ; wird es durch die Schleife neu erstellt
     DirCreate($source)
     DirCreate($sP1)
    
    
    
    
     ; Durchsuchen der Verzeichnisse nach PDF Dateien
     $file1 = FileFindFirstFile ($sP1 & "\*.pdf")
     If $file1 <> -1 then Print1()
     FileClose($file1)
    
    
    WEnd
    
    
    ;-------------------------------------------------------
    
    
    
    
    Func Print1()
    
    
    
    
    ;Standarddrucker umsetzen
    RunWait($pathtosetdefaultprinter & "\SetDefaultPrinter.exe " & $P1, "", @SW_HIDE)
    
    
    
    
     While 1
    
    
    ;PDF Datei existiert im Verzeichnis, Vorgang startet
      $pdffile = FileFindNextFile($file1)
      If @error then ExitLoop
    
    
      FileWriteLine($logfile, "--------------------")
      FileWriteLine($logfile,$date)
      FileWriteLine($logfile,@HOUR &":"&@MIN &":"& @sec)
      FileWriteLine($logfile, " ")
      FileWriteLine($logfile, $pdffile & " gefunden")
    
    
    
    
    ;Warten bis Datei vollstaendig gespeichert ist
      $sltime1=10000
       FileWriteLine($logfile, "   Warten auf Speicherung damit Druck starten kann...Sleeptime " & $sltime1 & "ms")
       Sleep($sltime1)
    
    
    
    
    
    
    
    
    ;Druck der PDF
       FileWriteLine($logfile, $pdffile & " " & "an Drucker " & $P1 & " " & "uebergeben")
       FileWriteLine($logfile,@HOUR &":"&@MIN &":"& @sec)
        RunWait('"' & $program & '\SumatraPDF.exe" -print-to '& $P1 &' -silent -exit-when-done "' & $sP1 & '\' & $pdffile & '"')
       FileWriteLine($logfile, $pdffile & " " & "an Drucker gedruckt")
       FileWriteLine($logfile,@HOUR &":"&@MIN &":"& @sec)
    
    
    
    
    
    
    
    
    ;Warten bis gedruckt wurde und EMail (PDF) verschicken
      $sltime2=20000
       FileWriteLine($logfile, "   Warten bis gedruckt wurde...danach EMail starten...Sleeptime " & $sltime2 & "ms")
       Sleep($sltime2)
    
    
        Run("c:\Batch\RW_LS.bat")
       FileWriteLine($logfile, $pdffile & " " & "per EMail geschickt")
       FileWriteLine($logfile,@HOUR &":"&@MIN &":"& @sec)
    
    
    
    
    
    
    
    
    ;Warten bis Versand fertig (Datei gesperrt) und Datei verschieben
      $sltime3=10000
       FileWriteLine($logfile, "   Warten bis EMail vollstaendig verschickt...Sleeptime " & $sltime3 & "ms")
       Sleep($sltime3)
    
    
        FileMove($source & '\' & $pdffile , $dest, 1)
       FileWriteLine($logfile, $pdffile & " " & "in Archiv verschoben")
       FileWriteLine($logfile,@HOUR &":"&@MIN &":"& @sec)
       FileWriteLine($logfile,"   Ende...Alle gefundenen PDF verarbeitet")
       FileWriteLine($logfile,"   Pruefungsintervall alle " & $interval & "ms")
    
    
     WEnd
    
    
    
    
    
    
    ;Standarddrucker wieder umsetzen
      RunWait($pathtosetdefaultprinter & "\SetDefaultPrinter.exe " & $standardprinter, "", @SW_HIDE)
    
    
    
    
    
    
    EndFunc
    ;-------------------------------------------------------
    
    
    Func Quit()
     Exit
    Alles anzeigen
  • Script als Dienst / Fehler 1053

    • rose0805
    • 5. Januar 2015 um 11:56

    Hallo, und Frohes Neues Jahr.

    Ich möchte das Thema noch einmal aufwärmen.

    Im obigen Script wird eine, in ein Verzeichnis kopierte/gespeicherte Datei gedruckt und gelöscht.

    Wie muss der Code aussehen (ich kenne mich damit nicht aus), dass wenn die Datei noch geöffnet ist (dann wird die Datei nur gedruckt und kann nicht gelöscht werden), NACH DEM SCHLIESSEN gelöscht wird.

    Wenn es ein CREATE gibt muss es doch auch ein CLOSE und dann den FileDelete geben, oder?

    Wenn so ein doofi das Verzeihnis zwischenzeitlich löscht, muss das auch wiederhergestellt werden.
    Geht das auch?

    Ansonsten wäre es nett, wenn mir jemand den Weg zeigen könnte mein Originalscript mit dem letzten Script sinnvoll zu vereinen... da hört es bei mir leider auf :(

    Vielen Dank.

    Vielen Dank.

  • Script als Dienst / Fehler 1053

    • rose0805
    • 19. Dezember 2014 um 13:07

    OK.
    Ich habs umgestrickt. Läuft gut.
    Wie und wann werd ich die Datei setzt los, wenn sie geöffnet ist?
    Gibbet da auch eine bessere Lösung?
    Wenn Sie zu ist kann ich sie ja löschen, aber wenn sie offen ist, hab ich zwar nicht das Problem das sie noch einmal druckt, aber die bleibt dann da auch stehen bis zum geht nicht mehr.
    Und wenn ich eine Schleife über die Verzeichnisse laufen lasse (wobei mir das jetzt nichts elegantes einfällt), löscht er mir im ungünstigsten Fall noch nicht gedruckte Dateien,oder?

    C
    #RequireAdmin
    #include <APIShellExConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WinAPIShellEx.au3>
    
    
    HotKeySet("q", raus) ; mit "q" Programm beenden
    
    
    ;$program = "C:\Programme\SumatraPDF"
    $program = "c:\Program Files (x86)\SumatraPDF"
    
    
    $P1 = "P040_lokal"
    $P2 = "P006"
    
    
    ;$status = DriveStatus( "T:" )
    ;If $status = "INVALID" Then
    ;DriveMapAdd("T:", "\\xxx.xxx.xxx.xxx\daily", 0,"local\###loginname###","###passwort###")
    ;EndIf
    
    
    ; Pfad der auf neue Dateien überwacht werden soll (Freigabename)
    ; Recht muss vorhanden sein
    ;$source = "T:\_PDF_Druck\"
    $source = "c:\Temp\PDF\Druck\"
    
    
    $sP1 = $source & $P1
    $sP2 = $source & $P2
    
    
    DirCreate($source)
    DirCreate($sP1)
    DirCreate($sP2)
    
    
    #Region ShellEvent registrieren
    Global $h_GUI = GUICreate("")
    Global $h_Msg = _WinAPI_RegisterWindowMessage('PDFDruck') ; Die Message "PDFDruck" wird an das Fenster $h_GUI gesendet wenn ein Event auftritt
    GUIRegisterMsg($h_Msg, 'ReactOnEvents')
    
    
    ; Die verschiedenen Ordner zur Überwachung registrieren:
    Global $h_ShellNotify1 = _WinAPI_ShellChangeNotifyRegister($h_GUI, $h_Msg, $SHCNE_CREATE, 0x3, FileGetLongName($sP1))
    Global $h_ShellNotify2 = _WinAPI_ShellChangeNotifyRegister($h_GUI, $h_Msg, $SHCNE_CREATE, 0x3, FileGetLongName($sP2))
    #EndRegion ShellEvent registrieren
    
    
    ; Endlosschleife
    Do
        Sleep(100)
    Until 0
    
    
    ; Funktion die aufgerufen wird wenn ein Event auftritt:
    Func ReactOnEvents(Const $hWndGUI, Const $MsgID, Const $wParam, Const $lParam)
        ; vollständigen Pfad der erstellten Datei auslesen:
        Local $s_FullPath = DllCall("Shell32.dll", "BOOLEAN", "SHGetPathFromIDListW", "ptr", DllStructCreate("PTR A; PTR", $wParam).A, "wstr", "")[2]
        Local $s_Path = StringLeft($s_FullPath, StringInStr($s_FullPath, "\", 1, -1) - 1)
        Local $s_Filename = StringTrimLeft($s_FullPath, StringInStr($s_FullPath, "\", 1, -1))
        Local $s_FileExtension = StringTrimLeft($s_Filename, StringInStr($s_Filename, ".", 1, -1))
    
    
        If $s_FileExtension = "pdf" Then ; nur bei pdf-Dateien reagieren
            ; Abhängig vom Pfad anders reagieren:
            Switch $s_Path
                Case $sP1
                      RunWait('"' & $program & '\SumatraPDF.exe" -print-to '& $P1 &' -silent -exit-when-done "' & $sP1 & '\' & $s_Filename & '"')
                      FileDelete($sP1 & '\' & $s_Filename)
                Case $sP2
                    ;MsgBox(0, "", 'Datei in "T:\_PDF_Druck\P006" erstellt: ' & $s_Filename)
                    MsgBox(0, "", 'Datei in' & $sP2 & 'erstellt: ' & $s_Filename)
            EndSwitch
        EndIf
    EndFunc   ;==>ReactOnEvents
    
    
    Func raus()
        _WinAPI_ShellChangeNotifyDeregister($h_ShellNotify1)
        _WinAPI_ShellChangeNotifyDeregister($h_ShellNotify2)
        Exit
    EndFunc   ;==>raus
    Alles anzeigen
  • Script als Dienst / Fehler 1053

    • rose0805
    • 19. Dezember 2014 um 09:12

    PS: Einen Haken hat mein Projekt, bzw. mein Script...

    Wenn der Anwender die PDF Datei aus dem Acrobat Reader in dem Zielordner speichern, und die Datei nicht geschlossen wird... na was passiert?
    Die Datei kann nicht gelöscht werden, weil ist ja gesperrt/geöffnet :| .
    Und das heißt, na? Die Datei wird alle x Sekunden gedruckt.
    Dumm wenn der Drucker am anderen Ende des Flurs steht und die PDF 50 Seiten hat ;)

    Egal was man macht, DIE schaffen es immer wieder Ideen auszuhebeln.

    Eigentlich müsste ich mir jetzt eine Protokolldatei erstellen, die den gleichen Namen hat, und wenn die da ist darf die Datei.pdf nicht mehr gedruckt werden. Und wenn die Originaldatei nicht mehr gesperrt ist, müssen beide gelöscht werden.

    Jetzt wirds mir zu kompliziert.

  • Script als Dienst / Fehler 1053

    • rose0805
    • 19. Dezember 2014 um 08:55

    Moin.
    Ja, sc create und diverse Scripts hab ich auch schon durch.
    Registry Einträge werden erstellt und der Dienst ist auch da.
    Die Fehlermeldung bleibt aber, und das macht mich wuschich. Schnauze voll ;)

    An autoit hab ich jetzt nicht mehr gedacht :):):) höhö.
    Aber da siehste mal, wenn was nicht funktioniert gehen die Augenklappen runter.

    Danke ;)

  • Script als Dienst / Fehler 1053

    • rose0805
    • 17. Dezember 2014 um 13:10

    Hallo.

    Alles Käse. Hab noch weiter gesucht, aber ich find einfach nix.

    Folgendes hab ich jetzt gemacht.

    1) DOS-Batch programmiert.
    Die Batch prüft ob meine Script.exe läuft oder nicht. Wenn nicht, dann starten oder Fehlermeldung schreiben.

    Code
    @echo off
    
    
    set ProgrammPfad=c:\AutoIt\Script
    set Programm=PDF_32bit.exe
    
    
    set ErrorLogPfad=c:\Temp\Error
    set ErrorLog=%Programm%_Error.txt
    
    
    rem ### ping -n 10 127.0.0.1 >nul
    
    
    tasklist |find /i "%Programm%" >nul
    if %errorlevel% == 0 (
    echo Das Programm "%Programm%" wird ausgefuehrt!
    goto exit2
    ) else (
    echo Das Programm "%Programm%" wird nicht ausgefuehrt... wird gestartet!
    goto start
    )
    
    
    :start
    FOR /F "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDATE=%%d%%c_%%b_%%a
    FOR /F "tokens=1,2,3 delims=:," %%a in ("%time: =0%") do set CTIME=%%a_%%b_%%c
    
    
    if not exist %ProgrammPfad%\%Programm% goto error
    
    
    start %ProgrammPfad%\%Programm%
    goto exit
    
    
    :exit
    tasklist |find /i "%Programm%" >nul
    if %errorlevel% == 0 (
    echo Programm %programm% wird nach 2. Versuch ausgefuehrt!
    goto exit2
    ) else (
    
    
    echo ErrorLog beachten : %ErrorLogPfad%\%ErrorLog%
    if not exist %ErrorLogPfad% md %ErrorLogPfad%\
    echo %CDATE% --- %CTIME% >%ErrorLogPfad%\%ErrorLog%
    echo Programm %programm% wird nach 2. Versuch immer noch nicht ausgefuehrt...  >>%ErrorLogPfad%\%ErrorLog%
    goto exit2
    
    
    :error
    echo ErrorLog beachten : %ErrorLogPfad%\%ErrorLog%
    if not exist %ErrorLogPfad% md %ErrorLogPfad%\
    echo %CDATE% --- %CTIME% >%ErrorLogPfad%\%ErrorLog%
    
    
    if not exist "%ProgrammPfad%\%Programm%" echo %ProgrammPfad%\%Programm% ist nicht vorhanden und kann nicht gestartet werden >>%ErrorLogPfad%\%ErrorLog%
    goto exit2
    )
    
    
    :exit2
    exit
    Alles anzeigen

    2) Ich red von einem Win2003 STD Server.
    Anmeldung mit dem local\Administrator und nicht mit dem Domänen Administrator via RDP.
    Unter dem local\Administrator hab ich die o.g. Batch in die Autostart gepackt, und zusätzlich als Task läuft die alle 30 min.
    Der Task bringt zwar nix, weil ich Hund den Abmelde-Button für diesen User einfach entfernt hab.

    Dies geht so, s.u. .... oder über die Gruppenrichtlinie:
    [für den Anwender]
    HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Policies\ Explorer
    [für das System (alle Anwender)]
    HKEY_LOCAL_MACHINE\ Software\ Microsoft\ Windows\ CurrentVersion\ Policies\ Explorer

    Erstellen Sie hier einen neuen Wert mit dem Namen "StartMenuLogOff" als Datentyp REG_DWORD. Setzen Sie den Wert auf: 1

    Abmelden wird aus dem Startmenü nach einem letzten Abmelden entfernt.

    Geschlossen kann die RDP Session dann nur noch über das X in der Fensterecke... unschön, aber der Script läuft weiter ;)
    Die Anmeldung mit anderen Usern beeinflußt das Skript nicht.

    Mir fehlt die Energie noch andere Sachen auszuprobieren.

    Wenn jemand noch eine Idee hat, gerne.

    Das original Script funktioniert gut. Ein bisschen aufwendige Kopiererei wenn es mehr Drucker werden.
    Die Vorschläge funktionieren aber ebenso gut.
    Den DriveMapAdd Code konnte ich gebrauchen und der ist ebenfalls eingebaut.

    Vielen Dank für die bisherige Hilfe.

  • Script als Dienst / Fehler 1053

    • rose0805
    • 12. Dezember 2014 um 11:52

    Hi.

    Ich bin grad leider mit anderen Dingen zu und komme nicht zum Testen.
    Aber danke für den Tipp.

    Für mich ist nur wichtig, dass das Programm immer! läuft. Beim Systemstart könnte ich es auch simpel in den Autostart-Ordner kopieren.
    Dummerweise bin ich nicht der einzige, der auf dem PrintServer arbeitet, und ich muss verhindern, dass das Programm durch abmelden etc. beendet wird.
    Ich könnt mir zwar einen User X anlegen, der nicht für RDP im Allgemeinen verwendet wird, und das damit starten.
    Aber irgendwann blickt das keine Sau mehr.

    Außerdem, und das reizt mich halt an der Sache... ich will einfach wissen warum das nicht geht.
    Das übel sitzt ja meist vor dem PC, und da fühlt man sich ja schon an der Ehre gepackt ;)

  • Script als Dienst / Fehler 1053

    • rose0805
    • 10. Dezember 2014 um 14:11

    Danke.
    Ich werd es ausprobieren und melde mich ;)

  • Script als Dienst / Fehler 1053

    • rose0805
    • 9. Dezember 2014 um 15:19

    Tut mir leid, ich seh den Wald nicht, und versteh es nicht:

    Vereinfacht dargestellt....

    Mein Beispiel:

    Code
    [color=#008000]$source[/color] = "T:\_PDF_Druck\"
    [color=#FF0000]$P1[/color]=P003
    [color=#FF8C00]$sP1[/color] = [color=#0000FF][/color][color=#008000]$source[/color][color=#0000FF] & [/color][color=#FF0000]$P1[/color]
    
    
    RunWait('"' & $program & '\SumatraPDF.exe" -print-to '& [color=#FF0000][u]$P1[/u][/color] &' -silent -exit-when-done "' & [color=#DAA520]$sP1[/color] & '\' & $pdffile & '"')

    ... und ich versteh das so, dass Dein $printer = Mein $sP1 = $source & $P1 ist.
    Die Syntax von Sumatra braucht aber den Druckernamen ($P1) hinter "-print-to" >>> ohne Pfad ...
    Die Syntax funktioniert. An Sumatra liegt das nicht.

    Wo bekommst Du jetzt die variable $printer_name her, und wo definierst Du die?

    Ich mein wo/wie wird $pinter_name zusammengebaut?

    Deine Beispiele:

    Code
    If $file2 <> -1 then Print($sP2,$file2)
    
    
    Func Print($printer,$printfile)
    ConsoleWrite('"' & $program_path & 'SumatraPDF.exe" -print-to '& [u][color=#0000FF]$printer[/color][/u] &' -silent -exit-when-done "' & [color=#0000FF]$printer[/color] & '\' & $pdffile & '"')
    
    
    RunWait('"' & $program_path & '\SumatraPDF.exe" -print-to '& [u][color=#0000FF]$printer[/color][/u] &' -silent -exit-when-done "' & [color=#0000FF]$printer[/color] & '\' & $pdffile & '"')

    So sollte es wahrscheinlich heißen

    Code
    ConsoleWrite('"' & $program_path & 'SumatraPDF.exe" -print-to '& [color=#0000FF]$printer_name[/color] &' -silent -exit-when-done "' & $printer & '\' & $pdffile & '"')

    Oder sind das jetzt zwei zusammengewürfelte Codes...
    ???

    Ich brauch 3 : Variablen Drucknamen \ Variables Druckerverzeichnis (VerzeichnisPfad + Druckername) \ Varibales File

  • Script als Dienst / Fehler 1053

    • rose0805
    • 9. Dezember 2014 um 14:10

    Hallo gmmg.

    Zeile 13 musste ich trennen. Ich hab immer die Meldung bekommen, dass die Variable nicht deklariert ist ?

    In Zeile 49+54 musst Du mir kurz helfen bitte.
    Wo wird der Drucker definiert? Hinter "print-to" muss der Drucker stehen (bei mir im Beispiel die Variable $p1)...
    Wenn ich die Programmierung so verstehe, und ich rate jetzt, wird $printer mit dem Pfad ausgeliefert. Und den Drucker gibt es nicht, der heißt nur P006 zb)...

    ... Was ich sagen will: Es wird nicht gedruckt ...

    Code
    Func Print($printer,$printfile)
    RunWait($pathtosetdefaultprinter & "\SetDefaultPrinter.exe " & $printer, "", @SW_HIDE)
    
    
    Func Print($printer,$printfile)
    RunWait($pathtosetdefaultprinter & "\SetDefaultPrinter.exe " & $printer, "", @SW_HIDE)
    While 1
            $pdffile = FileFindNextFile($printfile)
            If @error then ExitLoop
            RunWait('"' & $program & '\SumatraPDF.exe" -print-to '& [u]$printer[/u] &' -silent -exit-when-done "' & $printer & '\' & $pdffile & '"')
            FileDelete($printer & '\' & $pdffile)
    
    WEnd
        RunWait($pathtosetdefaultprinter & "\SetDefaultPrinter.exe " & $standardprinter, "", @SW_HIDE)
    
    
     EndFunc
    Alles anzeigen

    Wie geht das?

    Der File Delete funktioniert :)

    PS: Dein Script als .exe kompiliert funktioniert auch nicht als Dienst.

  • Script als Dienst / Fehler 1053

    • rose0805
    • 9. Dezember 2014 um 11:07

    Ich arbeite auf dem Server als Administrator.
    Zudem hab ich die Pfade selbst angelegt.
    Das im Script verwendete Laufwerk T: ist allerdings ein gemapptes Netzwerklaufwerk. Aber auch darauf hab ich Adminrechte.

    OK...
    Wie beschrieben #RequireAdmin oben in den Script eingefügt..
    Ich habe das Verzeichnis jetzt auch mal manuell erstellt und eine PDF reingelegt => funktioniert nicht.
    Lokales Systemkonto mit und ohne Option Datenaustausch zwischen Dienst und Desktop => funktioniert nicht.
    Anmelden als - Domänen Administrator => funktioniert nicht.

    Quergedacht habe ich es auch mal mit (nssm install "C:\Programme\autoit3\autoit3.exe c:\autoit\script\pdf.au3") ausprobiert.
    Der Dienst wird installiert.
    Wenn ich den starte kommt die Fehlermeldung: 3 beendet - Ereigniskennung 7024
    -------------
    Explanation
    The specified service stopped
    unexpectedly with the error indicated in the message. Windows does not
    recognize the service's error code.

    sc query pdf gibt aus:
    Type 110
    State 1 stopped
    Win32_Exit_Code 1066
    Service_Exit_Code 3
    Checkpoint 0x0
    Wait_Hint 0x0
    -------------

    mmmmmh?!?!?!?

  • Script als Dienst / Fehler 1053

    • rose0805
    • 9. Dezember 2014 um 09:46

    Hi.
    Das habe ich gemacht und es hat NICHT funktioniert... ich war schon ein Schritt weiter, und hab versucht die von NSSM erstellten Registryeinträge zu manipulieren ;)

    Bzw.: Um es genauer zu formulieren...
    NSSM funktioniert und mit (nssm install Dienstname "Pfad\xxx.exe") lässt sich das auch wunderbar installieren.
    Die xxx.exe läuft auch, das sehe ich im Taskmanager, ABER sie arbeitet nicht...
    Laut Script müssten die Verzeichnisse erstellt werden... da hakt es schon...

    Ich bin zwar dank des Tipps weiter, ich habe einen laufenden Dienst ....yeaaah.... (DANKE)... aber es funzt nicht.
    Es muss also am Script liegen, und darum haben die anderen Methoden vielleicht auch versagt.

    Sorry für die Verwirrung...

  • Script als Dienst / Fehler 1053

    • rose0805
    • 8. Dezember 2014 um 15:54

    Es muss definitiv am Script liegen.
    Das NSSM Tool arbeitet einwandfrei.

    Sofern ich in der Registry die Testdatei (ich hab mal nssm.exe zum Verusuch genommen) gegen meine kompilierte Script .exe austausche kommt die Fehlermeldung direkt...

  • Script als Dienst / Fehler 1053

    • rose0805
    • 8. Dezember 2014 um 14:50

    OK.
    Wenn ich nicht weiterkomme muss ich mich in die API-Funktion reinfuxen.

    Vorher würd ich das schon bestehende aus Zeitgründen erst versuchen zu retten ;)

    Das mit NSSM probiere ich aus. Danke.
    Für weitere Vorschläge bin ich natürlich offen...

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™