swister
Goto Top

Sobald PDF-Datei im Verzeichnis PDF-Datei ausdrucken

Hallo,

Ich habe ein kleines Programm geschrieben, dass mir sobald eine PDF-Datei im Verzeichnis vorhanden ist diese ausdruckt und danach die Datei löscht.
Jetzt habe ich aber das Problem dass es die Datei manchmal garnicht druckt manchmal aber auch zweimal.

Ich lasse mir den Ausdruck in eine Log-Datei schreiben, und da taucht dann eben der Dateiname manchmal bis zu 4x auf.
Wenn der Dateiname nur einmal auftaucht, wurde nicht gedruckt, bei mehr als zweimal wurde auch zweimal gedruckt.

Wie kann ich das Programm ändern damit es die Datei immer einmal druckt?
Oder würdet Ihr das ganz anders bewerkstelligen?

:start

FOR %%p in ("C:\Dateien\PDF\*.pdf") do (

start "Ausdruck" "C:\Programme\Adobe\Reader 8.0\Reader\AcroRd32.exe" /p /h "%%p"

timeout 0020

echo Druck = %%p %date% %time% >> Logdatei.log

kill /F AcroRd32.exe


del "%%p"

)

timeout 0020

goto start

Danke

Gruß Swister

Content-ID: 266795

Url: https://administrator.de/contentid/266795

Ausgedruckt am: 26.11.2024 um 07:11 Uhr

Meierjo
Meierjo 19.03.2015 um 07:35:31 Uhr
Goto Top
Hallo

Auf welchem Betriebssystem?

Der Befehl timeout funktioniert so?
Ich dachte, der Befehl lautet timeout /t 20??

In welchem Abstand werden denn die selben Dateien im Logfile aufgelistet?

Kann es sein, dass der Ausdruck noch nicht erfolgt ist, wenn der Batch das nächste Mal startet, und die Datei so mehrere Male zum Ausdruck geschickt wird, bevor sie gelöscht wird?

Gruss Urs
joehuaba
joehuaba 19.03.2015 um 08:34:52 Uhr
Goto Top
Was auf deinem Rechner nicht passt, oder warum die Batch nicht läuft kann ich dir nicht sagen.

Aber ich gib dir nen Tipp:

Ich würde das in einem einfachen vb.net-Programm lösen face-smile
Für solch eine Sache vielleicht ohne Oberfläche ?!
Mit einem Timer im Hintergrund der (z.B. jede Minute) prüft ob eine neue PDF in dem Verzeichnis liegt.
Wenn ja dann print() und delete()
Sollte in Wenigen Minuten fertig programmiert sein, sind ja nur wenige zeilen.

Fertsch face-smile
114757
114757 19.03.2015 aktualisiert um 08:36:23 Uhr
Goto Top
Moin Swister,
hatten wir hier auch schon mal ein schönes Powershell-Script zum Thema von @colinardo
PDF via Powershell drucken - Reader nach druck schließen

Gruß jodel
joehuaba
joehuaba 19.03.2015 um 09:52:07 Uhr
Goto Top
So also ich habe schnell was zusammengebastelt in vb.net face-smile
Die Pfade musst du natürlich anpassen, vielleicht sind auch noch 1-2 kleine Fehlerchen drin,
aber an sich sollte das so passen & funktionieren.

Imports System.IO

Public Class PrintDeletePDF

    Private Sub PrintDeletePDF_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Form ausblenden da sie nicht gebraucht wird  
        Me.Visible = False

        'Timer starten  
        tmrCheckPDF.Enabled = True

    End Sub

    Private Sub tmrCheckPDF_Tick(sender As Object, e As EventArgs) Handles tmrCheckPDF.Tick
        'Array definieren  
        Dim array()

        'Variablen definieren  
        Dim pfad As String = "C:\PDF"  
        Dim pdfname As String = ""  
        Dim i
        Dim x

        'Groesse des Arrays ermitteln  
        x = UBound(array)

        'Dateien auslesen  
        array = Directory.GetFiles(pfad, "*pdf")  

        'Dateien drucken und loeschen  
        For i = 0 To x
            Shell("C:\Programme\Adobe\Reader10\Reader\AcroRd32.exe /p /h " + array(i))  
            Shell("del " + pfad + array(i))  
            i = i + 1
        Next

        'Timer zuruecksetzen  
        tmrCheckPDF.Stop()
        tmrCheckPDF.Start()

    End Sub
End Class
114757
114757 19.03.2015 aktualisiert um 09:56:44 Uhr
Goto Top
@joehuaba
In Zeile 33 wird der Code aber mit Sicherheit das File vor dem Drucken gelöscht haben, oder eine Exception ausgelöst wenn das File gerade durch den Acrobat-Prozess gesperrt ist face-wink Die Shell wartet nicht auf das Beenden der Anwendung....

Ein FileSystemWatcher wäre hier auch eine geeignetere Variante um neue Files in einem Ordner zu detektieren.

Gruß jodel32
joehuaba
joehuaba 19.03.2015 um 10:17:05 Uhr
Goto Top
@114757

Stimmt, nicht aufgepasst :D

Naja war auch nur schnell zusammengebastelt face-smile
Aber wenn Swister ein bisschen VB kann, dann ist das auch wieder mit einer weiteren Zeile gelöst face-smile

Dann muss eben noch ein timeout eingebaut werden und ein
Shell("kill /F AcroRd32.exe")  

Ist zwar nicht die Beste Methode, eigentlich ist es sogar ein "bisschen" Pfusch, aber für dieses einfache Vorhaben würde es reichen face-smile

Da fällt mir gerade auf: Zeile 20 wird auch nicht gebraucht.

Und am Besten noch ein
Try

blablabla Code

Catch
End Try

in die Private Sub Timer bauen, falls wirklich ein Fehler geschmissen wird.


Danke an jodel32
joehuaba
joehuaba 19.03.2015 um 10:51:36 Uhr
Goto Top
So sollte das fertige vb-Programm in etwa aussehen:
Imports System.IO

Public Class PrintDeletePDF

    Private Sub PrintDeletePDF_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Form ausblenden da sie nicht gebraucht wird  
        Me.Visible = False

        'Timer starten  
        tmrCheckPDF.Enabled = True

    End Sub

    Private Sub tmrCheckPDF_Tick(sender As Object, e As EventArgs) Handles tmrCheckPDF.Tick
        Try

            'Array definieren  
            Dim array()

            'Variablen definieren  
            Dim pfad As String = "C:\PDF"  
            Dim i
            Dim x

            'Groesse des Arrays ermitteln  
            x = UBound(array)

            'Dateien auslesen  
            array = Directory.GetFiles(pfad, "*pdf")  

            'Dateien drucken und loeschen  
            For i = 0 To x
                Shell("C:\Programme\Adobe\Reader10\Reader\AcroRd32.exe /p /h " + array(i))  
                System.Threading.Thread.Sleep(7000) 'Wartet 7 Sekunden  
                Shell("kill /F AcroRd32.exe")  
                System.Threading.Thread.Sleep(3000) 'Wartet 3 Sekunden  
                Shell("del " + pfad + array(i))  
                i = i + 1
            Next

            'Timer zuruecksetzen  
            tmrCheckPDF.Stop()
            tmrCheckPDF.Start()
        Catch
            MsgBox("Es ist ein Fehler aufgetreten.")  
        End Try

    End Sub
End Class
Swister
Swister 19.03.2015 aktualisiert um 11:00:17 Uhr
Goto Top
@Meierjo
Es handelt sich hier noch um Windows 2000

Ja, der timeout funktioniert so.

Den genauen Abstand kann ich jetzt nicht sagen, sind aber glaube ich so um die 20 Sek.

Gruß Swister
Swister
Swister 19.03.2015 aktualisiert um 11:00:43 Uhr
Goto Top
@114757
Danke, werde mir das mal anschauen.

Gruß Swister
Swister
Swister 19.03.2015 aktualisiert um 11:01:08 Uhr
Goto Top
@joehuaba

Danke für das Script, werde es mal testen.
Ich habe hier allerdings noch Windows 2000, läuft das damit auch?

Gruß Swister
joehuaba
joehuaba 19.03.2015 um 11:49:09 Uhr
Goto Top
- Also du lädst dir Visual Studio Express runter (kostenlos)
- Erstellst ein Neues Projekt (Programm) mit meinem Quellcode
und lässt dir die .exe daraus generieren.

So, ob das nun unter Win2k auch noch läuft,
kann ich dir leider nicht versprechen, wegen den .NET Frameworks

Musst du ausprobieren face-smile
Swister
Swister 23.03.2015 aktualisiert um 14:45:11 Uhr
Goto Top
@joehuaba

Beim erstellen erhalte ich folgende Fehlermeldungen!?

"tmrCheckPDF" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird.

Gruß Swister
joehuaba
joehuaba 23.03.2015 um 14:54:14 Uhr
Goto Top
Das "tmr" steht für Timer, damit man sich besser zurecht findet.

Du hast links im Programm eine Leiste (Die du vlt erst aufklappen musst) wo du Sachen wie
- Button
- TextBox
- etc
hast. Da gibt es auch einen Timer den du erst in deine Oberfläche des Programms ziehen musst.
Den benennst du dann "tmrCheckPDF". Das sollte das Problem lösen face-smile

Kann dir aber auch gern irgendwie das fertige VB-Projekt zukommen lassen !
Swister
Swister 23.03.2015 aktualisiert um 16:32:56 Uhr
Goto Top
Hallo,

Hab Dir eine Nachricht mit meiner Adresse geschickt.
Du musst aber folgende Zeilen anpassen

 
Dim pfad As String = "C:\Zertifikate\PDF"   
Shell("C:\Programme\Adobe\Reader 8.0\Reader\AcroRd32.exe /p /h " + array(i))   


Danke

Gruß Swister