Script als Dienst / Fehler 1053

  • Hallo Gemeinde.

    Ich beschäftige mich erst seit kurzem mit Programmierung und AutoScript.
    Bitte verzeiht mir, dass ich ein Thema noch einmal aufwärme. Die Threads die ich hier und im Internet gefunden habe verstehe ich nicht, oder kann Sie nicht umsetzen.

    Es wäre schön wenn mir jemand helfen könnte, und zwar so das ich es verstehe...

    Ich möchte einen AutoitScript (Version 3.3.12.0) als Dienst unter Windows 2003 32Bit laufen lassen.
    Ich habe diverse Scripts gefunden, mit der ich die .exe auch wunderbar in die Diensteverwaltung bekomme.
    Ich hab es auch mit sc create und installsrv /srvany probiert.
    Die Registry Einträge (Parameters/Application wird zB. oft genannt) sind da...

    Ich gehe davon aus, dass das "erstellen des Dienstes funktioniert" hat?! und es an der Programmierung liegt.

    Wenn ich den Dienst starten möchte kommt die Fehlermeldung :
    "Der Dienst xxx auf "lokaler Computer" konnte nicht gestartet werden. Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung."
    (Zu dem Thema habe ich auch Google Einträge gefunden. Wenn ich dort fündig geworden wäre würd ich hier nix schreiben.)

    Mit dem DOS Befehl "net start Dienst" bleibt das Starten des Dienstes gar hängen und läst sich nicht mehr beenden. Reboot oder sc delete sind dann nötig.
    Der Start über die Dienste bringt diesen Fehler nicht, da kommt die Fehlermeldung artig.

    In einigen Threads habe ich gelesen, dass das als lokales Systemkonto mit Datenaustausch zwischen Dienst und Desktop zulassen aktiviert sein muss. Hab ich aktiviert.
    Auch in den Ereignisprotokollen (die sind eingeschaltet, der Tipp hatte auch keinen Erfolg gebracht) finde ich keine Fehlereinträge.

    In einem Beitrag habe ich gelesen, dass das an der While Schleife liegen könnte, daher o.g. Anmeldung mit Datenaustausch Option.
    Und dass das Script "Diensttauglich" programmiert sein muss.
    Das hilft mir aber nicht.... was muss ich dafür machen???

    Rufe ich die kompilierte .exe normal über Explorer etc. auf funzt das wie dopp.

    Mein Problem ist, dass der Script immer laufen soll. Melde ich mich vom Windows 2003 aus der RDP Session ab, wird das Programm nicht mehr ausgeführt ?!?!?
    Ja, ich könnte mich mit einem anderen User anmelden, und die Session ohne abmelden beenden, das will ich aber nicht. Das macht das Rebooten zu kompliziert.

    Es muss doch als Dienst gehen, ich kapier es nur nicht...
    Außerdem will ich daran lernen wie das funktioniert. Also bitte keinen Shitstorm über mich herabregenen lassen ;)


    Das gefundene und angepasste Script sucht in definierten Verzeichnissen nach PDF Dateien, und druckt diese auf lokal angelegten Druckern aus.

    Vielleicht hat jemand eine Idee......

    By the way und bitte als Nebenfrage betrachten:
    Bestimmt hat jemand Optimierungvorschläge, wenn mehere Druckerverzeichnisse überwacht werden sollen.
    Für sowas muss es doch auch eine Schleife oder etwas eleganteres geben.

  • AutoIt-Skripte als Dienst...damit viel Glück, das versuche ich jetzt bestimmt schon seit über 1 Jahr immer wieder mal und bis jetzt hat mir der bescheuerte System-Nutzer noch jedesmal volle Kanne eins reingehaun :D

    Bild1: Ich beim debuggen

  • Zu deinem konkreten Problem kann ich dir nicht weiterhelfen.
    Ich habe allerdings selbst mal lange nach einer stabilen Lösung für nginx als Windows-Dienst gesucht und habe sie schlussendlich in der Verwendung von NSSM gefunden: >>NSSM<<

    Bestimmt hat jemand Optimierungvorschläge, wenn mehere Druckerverzeichnisse überwacht werden sollen.
    Für sowas muss es doch auch eine Schleife oder etwas eleganteres geben.

    Ja was eleganteres gibt es.
    Du checkst bisher immer in regelmäßigen Abständen die Ordner auf PDF-Dateien.
    Besser wäre es zu sagen: Hey Windows - sag mir einfach Bescheid wenn in dem Ordner eine neue Datei erstellt wird - ich leg mich bis dahin schlafen.
    Diese Funktionalität erreicht man z.B. mit der API-Funktion ShellChangeNotifyRegister.
    Eine beispielhafte Umsetzung findest du >>hier<<

    Für deinen Fall wäre ein prinzipieller Aufbau folgender (Hier mit msgbox statt deinem print-Zeug):

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <APIShellExConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WinAPIShellEx.au3>

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

    HotKeySet("q", raus) ; mit "q" Programm beenden

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

    #Region ShellEvent registrieren
    Global $h_GUI = GUICreate("")
    Global $h_Msg = _WinAPI_RegisterWindowMessage('irgendwas') ; Die Message "irgendwas" wird an das Fenster $h_GUI gesendet wenn ein Event auftritt
    GUIRegisterMsg($h_Msg, 'ReactOnEvents')

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

    ; Die verschiedenen Ordner zur Überwachung registrieren:
    Global $h_ShellNotify1 = _WinAPI_ShellChangeNotifyRegister($h_GUI, $h_Msg, $SHCNE_CREATE, 0x3, FileGetLongName("T:\_PDF_Druck\P003"))
    Global $h_ShellNotify2 = _WinAPI_ShellChangeNotifyRegister($h_GUI, $h_Msg, $SHCNE_CREATE, 0x3, FileGetLongName("T:\_PDF_Druck\P006"))
    #EndRegion ShellEvent registrieren

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

    ; Endlosschleife
    Do
    Sleep(100)
    Until 0

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

    ; 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))

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

    If $s_FileExtension = "pdf" Then ; nur bei pdf-Dateien reagieren
    ; Abhängig vom Pfad anders reagieren:
    Switch $s_Path
    Case "T:\_PDF_Druck\P003"
    MsgBox(0, "", 'Datei in "T:\_PDF_Druck\P003" erstellt: ' & $s_Filename)
    Case "T:\_PDF_Druck\P006"
    MsgBox(0, "", 'Datei in "T:\_PDF_Druck\P006" erstellt: ' & $s_Filename)
    EndSwitch
    EndIf
    EndFunc ;==>ReactOnEvents

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

    Func raus()
    _WinAPI_ShellChangeNotifyDeregister($h_ShellNotify1)
    _WinAPI_ShellChangeNotifyDeregister($h_ShellNotify2)
    Exit
    EndFunc ;==>raus

    [/autoit]
  • 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...

  • 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...

  • 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...

    Ich glaube du hast da etwas missverstanden. Du sollst nicht statt deiner exe die nssm.exe manuell als Dienst eintragen, sondern per NSSM.exe (einfach mal die exe ausführen) dein Programm als Dienst einrichten und schauen ob es dann funktioniert. Und eben nicht mehr mit srvany arbeiten - nur noch mit NSSM.

  • 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...

    3 Mal editiert, zuletzt von rose0805 (9. Dezember 2014 um 09:56)

  • Einfach mal ins Blaue geraten wegen der Verzeichnisse: Keine Rechte als Normaluser für die Verzeichnisse?
    Also mal oben ein #RequireAdmin in das Skript und das Skript als Admin-Dienst eintragen.

  • 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?!?!?!?

  • hallo rose0805,

    habe die PrintFunktion wie folgt zusammengefasst!
    desweiteren mal prüfen ob das T: Laufwerk bzw. der pfad existiert.
    falls der dienst als system, ausgeführt wird, heißt das nicht, das der pfad auch da ist. eventuell unc pfade zur freigabe nutzen!

    Spoiler anzeigen
    [autoit]


    ;Pfad zu PDF Viewer
    $program = "C:\Programme\SumatraPDF"

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

    $pathtosetdefaultprinter = "c:\AutoIt\Program"
    $standardprinter = "P040"
    $P1 = "P003"
    $P2 = "P006"

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

    ; Pfad der auf neue Dateien überwacht werden soll
    ; Recht muss vorhanden sein
    $source = "T:\_PDF_Druck\"

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

    If $iFileExists = FileExists($source) Then
    MsgBox(0, "", "The file exists." & @CRLF & "FileExist returned: " & $iFileExists)
    Else
    MsgBox(0, "", "The file doesn't exist." & @CRLF & "FileExist returned: " & $iFileExists)
    EndIf

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

    $sP1 = $source & $P1
    $sP2 = $source & $P2

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

    ; Pfad, in den die Dateien nach dem Drucken verschoben werden sollen
    $dest = "T:\_PDF_Druck\save"

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

    ; Dauer des Prüfintervalls in Millisekunden (10 Sek = 10000)
    $interval = 5000

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

    While 1

    Sleep($interval)

    ; Druckverzeichnisse für jeden Drucker erstellen falls es mal geloescht wird
    IF Not FileExists($sP1) Then DirCreate($sP1) ; wenn es nicht da ist, wird es erstellt! du hast es immer neu erstellt
    IF Not FileExists($sP2) Then DirCreate($sP2) ; wenn es nicht da ist, wird es erstellt! du hast es immer neu erstellt

    ; Durchsuchen der Verzeichnisse nach PDF Dateien
    $file1 = FileFindFirstFile ($sP1 & "\*.pdf")
    If $file1 <> -1 then Print($sP1,$file1)
    FileClose($file1)

    $file2 = FileFindFirstFile ($sP2 & "\*.pdf")
    If $file2 <> -1 then Print($sP2,$file2)
    FileClose($file2)

    WEnd

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

    Func Print($printer,$printfile)

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

    RunWait($pathtosetdefaultprinter & "\SetDefaultPrinter.exe " & $printer, "", @SW_HIDE)

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

    While 1
    $pdffile = FileFindNextFile($printfile)
    If @error then ExitLoop
    RunWait('"' & $program & '\SumatraPDF.exe" -print-to '& $printer &' -silent -exit-when-done "' & $printer & '\' & $pdffile & '"')
    FileDelete($printer & '\' & $pdffile)
    WEnd
    RunWait($pathtosetdefaultprinter & "\SetDefaultPrinter.exe " & $standardprinter, "", @SW_HIDE)

    EndFunc

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

    Func Quit()
    Exit
    EndFunc

    [/autoit]

    gruß gmmg

    3 Mal editiert, zuletzt von gmmg (9. Dezember 2014 um 15:09)

  • 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 ...

    Wie geht das?

    Der File Delete funktioniert :)

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

  • in meinem script sind noch fehler und das ist auch nicht getestet!
    Zeile 13-19 prüft ob das laufwerk t: vorhanden ist.

    könntest das aber auch so machen oder wie geschrieben unc pfade benutzen, dann sparst du dir den laufwerksbuchstaben
    $path = "\\server\freigabe"

    die Befehlszeilenparameter von SumatraPDF.exe kenne ich nicht, am besten hier auch im cmd den Befehl erstellen und dann nach autoit umsetzen!
    eine consolewrite('"' & $program & '\SumatraPDF.exe" -print-to '& $printer &' -silent -exit-when-done "' & $printer & '\' & $pdffile & '"') sollte da auch helfen, damit kannst du dir die Ausgabe nochmal im scite ansehen..

    [autoit]


    $status = DriveStatus( "T:" )
    ;MsgBox(0,"test", $status,1)

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

    If $status = "INVALID" Then
    DriveMapAdd("T:", "\\server", 0,"$ADMINUSER,$ADMINPASS)
    MsgBox(0,"T:\Laufwerk", "Verbindung hergestellt",1)
    EndIf

    [/autoit]
    Spoiler anzeigen
    [autoit]


    ;Pfad zu PDF Viewer
    $program_path = "C:\Programme\SumatraPDF\"

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

    $pathtosetdefaultprinter = "c:\AutoIt\Program\"
    $standardprinter = "P040"
    $P1 = "P003"
    $P2 = "P006"

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

    ; Pfad der auf neue Dateien überwacht werden soll
    ; Recht muss vorhanden sein
    $source = "T:\_PDF_Druck\"

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

    Local $iFileExists = FileExists("T:\") ; soll nur abfragen, ob laufwerk T: vorhanden ist!

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

    If $iFileExists Then
    MsgBox(0, "", "The file exists." & @CRLF & "FileExist returned: " & $iFileExists)
    Else
    MsgBox(0, "", "The file doesn't exist." & @CRLF & "FileExist returned: " & $iFileExists)
    EndIf

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

    $sP1 = $source & $P1
    $sP2 = $source & $P2

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

    ; Pfad, in den die Dateien nach dem Drucken verschoben werden sollen
    $dest = "T:\_PDF_Druck\save"

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

    ; Dauer des Prüfintervalls in Millisekunden (10 Sek = 10000)
    $interval = 5000

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

    $pdffile = "test.pdf"
    $printer = $P1

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

    ConsoleWrite('"' & $program_path & 'SumatraPDF.exe" -print-to '& $printer &' -silent -exit-when-done "' & $printer & '\' & $pdffile & '"')

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

    While 1

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

    Sleep($interval)

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

    ; Druckverzeichnisse für jeden Drucker erstellen falls es mal geloescht wird
    IF Not FileExists($sP1) Then DirCreate($sP1) ; wenn es nicht da ist, wird es erstellt! du hast es immer neu erstellt
    IF Not FileExists($sP2) Then DirCreate($sP2) ; wenn es nicht da ist, wird es erstellt! du hast es immer neu erstellt

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

    ; Durchsuchen der Verzeichnisse nach PDF Dateien
    $file1 = FileFindFirstFile ($sP1 & "\*.pdf")
    If $file1 <> -1 then Print($sP1,$file1) ;ruft die funktion print auf und übergibt die zwei parameter Drucker und Datei
    FileClose($file1)

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

    $file2 = FileFindFirstFile ($sP2 & "\*.pdf")
    If $file2 <> -1 then Print($sP2,$file2) ;ruft die funktion print auf und übergibt die zwei parameter Drucker und Datei
    FileClose($file2)

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

    WEnd

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

    Func Print($printer,$printfile)

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

    RunWait($pathtosetdefaultprinter & "SetDefaultPrinter.exe " & $printer, "", @SW_HIDE)

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

    While 1
    $pdffile = FileFindNextFile($printfile)
    If @error then ExitLoop
    RunWait('"' & $program_path & '\SumatraPDF.exe" -print-to '& $printer &' -silent -exit-when-done "' & $printer & '\' & $pdffile & '"')
    FileDelete($printer & '\' & $pdffile)
    WEnd
    RunWait($pathtosetdefaultprinter & "SetDefaultPrinter.exe " & $standardprinter, "", @SW_HIDE)

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

    EndFunc

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

    Func Quit()
    Exit
    EndFunc

    [/autoit]

    hab in zeile 30-33 mal das consolewrite eingebaut! musst du bei dir entpsrechend anpassen!

    http://www.sumatrapdfreader.org/manual-de.html
    ...
    der Befehl -print-to $printer_name $file.pdf druckt die angegebene PDF auf dem angegebenen Drucker

    gruß gmmg

    6 Mal editiert, zuletzt von gmmg (9. Dezember 2014 um 14:45)

  • Habe aber noch nicht so ganz verstanden, was du machen willst!

    Du hast 2 verzeichnisse in denen PDF Dateien liegen, diese möchtest du auf 2 verschiedenen Druckern ausdrucken!
    PDF Dateien aus Verzeichnis 1 auf Drucker 1, PDF Dateien aus Verzeichnis 2 auf Drucker 2!

    Ist das so richtig?

    Hier das Script nochmal abgewandelt.

    Spoiler anzeigen
    [autoit]


    local $file

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

    ;Pfad zu PDF Viewer
    $program_path = "C:\Programme\SumatraPDF\"

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

    $path_defaultprinter = "c:\AutoIt\Program\"
    $defaultprinter = "P040"

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

    $printer1 = "P003"
    $printer2 = "P006"

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

    ; Pfad der auf neue Dateien überwacht werden soll
    ; Recht muss vorhanden sein
    $source_path = "T:\_PDF_Druck\"

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

    Local $iFileExists = FileExists("T:\") ; soll nur abfragen, ob laufwerk T: vorhanden ist!

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

    If $iFileExists Then
    MsgBox(0, "", "The file exists." & @CRLF & "FileExist returned: " & $iFileExists)
    Else
    MsgBox(0, "", "The file doesn't exist." & @CRLF & "FileExist returned: " & $iFileExists)
    EndIf

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

    $full_source_path1 = $source_path & $printer1
    $full_source_path2 = $source_path & $printer2

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

    ; Pfad, in den die Dateien nach dem Drucken verschoben werden sollen
    $dest = "T:\_PDF_Druck\save\"

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

    ; Dauer des Prüfintervalls in Millisekunden (10 Sek = 10000)
    $interval = 5000

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

    ;----Test---
    ;$pdffile = $full_source_path1 & "test.pdf"
    ;$printer = $printer1
    ;ConsoleWrite('"' & $program_path & '\SumatraPDF.exe" -print-to '& $printer &' -silent -exit-when-done "' & $pdffile & '"')
    ;-----------

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

    While 1

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

    Sleep($interval)

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

    ; Druckverzeichnisse für jeden Drucker erstellen falls es mal geloescht wird
    IF Not FileExists($full_source_path1) Then DirCreate($full_source_path1) ; wenn es nicht da ist, wird es erstellt! du hast es immer neu erstellt
    IF Not FileExists($full_source_path2) Then DirCreate($full_source_path2) ; wenn es nicht da ist, wird es erstellt! du hast es immer neu erstellt

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

    ; Durchsuchen der Verzeichnisse nach PDF Dateien
    FindFile($full_source_path1)
    ; Print File if Exists
    If $file <> -1 then Print($printer1,$full_source_path1 & $file)
    FileClose($file)

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

    FindFile($full_source_path2)
    ; Print File if Exists
    If $file <> -1 then Print($printer2,$full_source_path1 & $file)
    FileClose($file)

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

    WEnd

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

    Func FindFile($path)
    $file = FileFindFirstFile ($path & "*.pdf")
    Return $file
    EndFunc

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

    Func Print($printer,$pdffile)

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

    ;RunWait($pathtosetdefaultprinter & "SetDefaultPrinter.exe " & $printer, "", @SW_HIDE)

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

    While 1
    $pdffile = FileFindNextFile($pdffile)
    If @error then ExitLoop
    RunWait('"' & $program_path & '\SumatraPDF.exe" -print-to '& $printer &' -silent -exit-when-done "' & $pdffile & '"')
    ;FileDelete($printer & '\' & $pdffile)
    WEnd
    ;RunWait($pathtosetdefaultprinter & "SetDefaultPrinter.exe " & $standardprinter, "", @SW_HIDE)

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

    EndFunc

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

    Func Quit()
    Exit
    EndFunc

    [/autoit]

    einen Default Printer musst du nicht setzen, wenn du direkt auf einen entsprechenden Drucker druckst!

    Gruß gmmg

    2 Mal editiert, zuletzt von gmmg (9. Dezember 2014 um 15:10)

  • 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

  • Ja, ich habe die Variablen mal so umbenannt, das auch ein dritter das gleich versteht!

    schau mal in den vorletzten Post (13) von mir, da stehen doch die neuen Varibalen definiert drin und sollten auch verständlich sein!

    gruß gmmg

  • Hallo!

    Das Thema Autoit als Server laufen zu lassen interessiert mich auch brennend. Leider bin ich auch nicht viel weiter gekommen als die Programme per Helper als Service zu integrieren. Direktes Eintrage terminiert nach kurzer Zeit mit einem Fehler. Scheinbar muss ein Servicedienst anderes Erzeugt werden, das (ist nur eine Vermutung) vom Compiler abhänig ist.

    Eine - für mich - elegante Methode das zu umgehen ist über den taskscheduler von Windows. Der läßt sich auch remote steuern, Programme mit Systemrechte laufen und es gibt eine Commandline dafür.

    Um ein selbstgeschriebenes Programm als "Dienst" laufen zu lassen mache ich folgenden Eintrag:
    schtasks /create /SC onstart /TN MeinProgramm /TR "c:\windows\system32\MeinProgramm.exe" /user:leser" /RU SYSTEM /RL highest /F

    Damit wird "MeinProgramm.exe" bei jedem Systemstart mit Systemrechte gestartet.

    vielleicht hilft Dir das!

    lg
    Racer

  • 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 ;)

  • Naja, dann bist mit dem Task eh richtig unterwegs :)

    Der Task wird wie ein Dienst vom System her gestartet und läuft. Der Prozesse ist im Taskmanager sichtbar (Benutzer: system) und kann nur von einern anderen Administrator (=user mit Adminrechte) beendet werden.
    Auf eine TS ist das unabhängig ob ein User dann angemeldet ist oder nicht - das hat nichts mit den Task zu tun!
    Was nicht geht (unter Windows 2003), erst ab Vista (ergo Windows 2008 Server) den Task remote über die Aufgabensteuerung zu beenden. Für ältere System (die man eh nicht mehr verwenden sollte) würde dann nur die Möglichkeit bestehen den Prozesse per RPC "abzuschiessen" (z.B.: pskill \\server ...)


    lg
    Racer

  • 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.

    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.