MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Windows, Anwendungen & Co. > Windows Automatisierung
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 05.10.2017, 06:49   #1
edv-master
MOF User
MOF User
Standard Per VBS Dateien in einem Ordner prüfen, an bestimmten Drucker drucken und verschieben

Hallo,

ich würde gerne mit einem VBS-Skript Dateien aus einem Ordner prüfen, und an Hand der Dateiendung auf einen bestimmten Drucker drucken.
Es soll z.B. das
Dokument "Brief.Normalpapier" auf den Drucker "DruckerNormalpapier" gedruckt werden
oder
Dokument "Brief.Briefbogen" auf den Drucker "DruckerBriefpapier" gedruckt werden

Ich bin bereits so weit, dass das drucken und selektieren des Druckers auch funktioniert, allerdings werden hier nur neue Dateien überwacht/bearbeitet - es soll aber alle Dateien in diesem Ordner abarbeiten, die Datei die das Skript bereits bearbeitet hat in einen Unterordner (z.B. "Erledig") verschieben, so dass diese nicht nochmal abgearbeitet werden.

(hier im Beispiel habe ich es mit .txt und .pdf getestet und über den Adobe Reader ausdrucken lassen - das müsste ich natürlich noch ändern....)

Code:

strFolder = "Z:FWdatenPrinting" 'ohne abschließenden "", auch bei Root-Folder

strUserFolder = """" & Replace(strFolder, "", "") & """"
strComputer = "."
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
Set objWMIService = GetObject("winmgmts:" & strComputer & "rootcimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
            & "TargetInstance.GroupComponent= " _
                & "'Win32_Directory.Name=" & strUserFolder & "'")

Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    strNewFile = objLatestEvent.TargetInstance.PartComponent
    arrNewFile = Split(strNewFile, "=")
    strFileName = arrNewFile(1)
    strFileName = Replace(strFileName, "", "")
    strFileName = Replace(strFileName, Chr(34), "")

    If strFileName = strFolder & "STOP" Then
        MsgBox "Überwachung von " & strFolder & " wird beendet."
        WScript.Quit
    End If

    Select Case LCase(fso.GetExtensionName(strFileName))
    
Case "txt" 'Typ in Kleinbuchstaben angeben

		objShell.Run """C:Program Files (x86)AdobeAcrobat Reader DCReaderAcroRd32.exe"" /s /h /p /t """ & strFileName & """ """ & "DELL3765-BCC360-IPv4" & """"
        'End With
        Set objWord = Nothing
        
Case "pdf" 'Typ in Kleinbuchstaben angeben
		objShell.Run """C:Program Files (x86)AdobeAcrobat Reader DCReaderAcroRd32.exe"" /s /h /p /t """ & strFileName & """ """ & "HPF83790 (HP OfficeJet Pro 8740)" & """"
    
	Case Else
        ' keine Aktion erforderlich
    End Select
    
Loop
Wie kann ich das Skript nun dazu bewegen "alle" Dateien in dem Verzeichnis durcharbeitet und anschließend in den Unterordner "Erledig" verschiebt?


Gruß und Danke

Stefan

__________________

Microsoft Windows 10 Enterprise & Pro, Microsoft Office Professional Plus 2016
edv-master ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.10.2017, 08:51   #2
haklesoft
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Stefan,

da die VBS-Spezis hier gerade nicht reagieren und Dir mein Hinweis auf das FileSystemObject offensichtlich nicht geholfen hat, gehe ich davon aus, dass Du den im Internet gefundenen Code nur mit Hilfe anpassen kannst.

Ein paar Fragen hätte ich noch:

Stehen in dem Printing-Verzeichnis ausschließlich Dateien, die gedruckt und anschließend verschoben werden sollen? Nach Durchlauf sollte das Verzeichnis dann immer wieder leer sein?

Welche Dateiarten können im Printing-Verzeichnis auftauchen?

Ist Dir klar, dass die Ausgabe auf einen Drucker aus vielfältigsten Gründen scheitern kann und die Dateien dann trotzdem verschoben sind?

Soll das Script sich auch um die Anlage des Erledigt-Verzeichnis kümmern?

Was soll im Erledigt-Verzeichnis passieren, wenn eine zu druckende Datei den Namen einer bereits gedruckten Datei hat?

Hast Du die Druckausgabe mit einer txt-Datei denn so mal probiert? Eine Text-Datei mit Hilfe des AdobeAcrobatReaders ausgeben zu wollen sieht für mich recht abenteuerlich aus.

Warum wird die Druckausgabe auf dem gewünschten Drucker nicht gleich im Ausgabeprogramm gemacht? Word z. B. hätte damit keine Probleme.

__________________

Hang loose, haklesoft
haklesoft ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.10.2017, 09:33   #3
edv-master
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo haklesoft,

nein, habe leider bis jetzt noch keine Lösung gefunden :-(
Hier nun die Antworten zu deinen Fragen:

1. in diesem Verzeichnis sind im Normalfall nur Dateien (PDF, die aber nicht mehr .pdf heißen sondern .Druckername - so ist es einfacher die Dokumente zuzuordnen) die auch gedruckt werden sollen, das Skript würde ja auch prüfen welche Dateien es abarbeiten soll (wo es eben einen "Druckernamen" gibt und nur dies nehmen und verschieben wo ein Drucker hinterlegt ist.

2. Es sind immer PDF-Dateien (nur eben eine andere Endung (Druckername) - wenn niemand aus versehen hier Dateien reinkopiert sollten es nur zu druckende Dateien sein.

3. Wenn ein Fehler auftritt sollte er am besten die Datei hier "liegen" lassen, denke aber das ist schwer bis unmöglich lösbar, wenn es nicht geht wäre es halb so schlimm ;-)

4. Anlage des "Erledigt-Verzeichnisses" wäre gut, hat aber keine Priorität - Wichtig wäre erst einmal die Funktion, das anlegen des Verzeichnisses wäre dann eine Verbesserung und kann später noch eingebaut werden.

5. Doppelte Dateinamen sollten nicht vorkommen, mein Plan wäre, ich erstelle Dateien die das Datum und die Uhrzeit (bis auf die Sekunde genau) enthalten, dann sollte hier nichts passieren - wenn das Skript die Datei verschiebt könnte das Skript ja auch wieder das "Druckdatum/Uhrzeit" in den Zieldateinamen einfügen, so sollten keine "doppelten" Dateinamen vorkommen, wenn doch, einfach überschreiben ;-)

6. Das drucken von TXT-Dateien ist nicht geplant, habe ich hier nur als Beispiel in dem Beispiel ;-) - gedruckt werden immer nur PDF-Dateien mit dem Acrobat

7. Bisher drucken wir die Dateien direkt über (zwischen 6 und 8) Netzwerkdrucker (vor allem Etikettendrucker mit versch. Etikettengrößen, unterschiedlichen Standorten im Betrieb, mit/ohne Logos usw.), allerdings ist immer min. ein PC von mehreren (oft sogar täglich) dabei wo einer der Netzwerkdrucker "spinnt" - also das Drucken hier aus den verschiedensten Gründen nicht geht. Wir haben aber an jedem Computer auch ein Netzlaufwerk welches gehen muss da sonst unser Programm (welches die PDF-Dateien erzeugt) nicht funktionieren würde (mit diesem Netzlaufwerk haben wir so gut wie gar keine Probleme) - deshalb meine Idee, der Client erstellt nur die Druckaufträge, der Server (das Skript auf dem Server) der druckt die Dateien nur aus - so ist nur noch ein PC (der Server) mit Wartung an Druckertreibern usw. erforderlich)
Zudem ist es auch sehr sehr aufwendig, wenn man einen neuen Drucker installiert diesen auf 10 bis 15 PCs einzurichten, so würde ich diesen auf dem Server konfigurieren und schon würde wieder alles passen ;-)


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


PS: das Programm was die Druckdateien im übrigen erstellt ist eine Access2016-Datenbank (falls das evtl. interessant wäre) - die Drucker sind auf dem Server installiert und per Netzwerkfreigabe freigegeben welche jeder Client installieren (verknüpfen) muss - mit diesem Skript plane ich/wir eben dieses lästige Problem mit den Netzwerkdruckern zu umgehen....

....oder weiß jemand eine bessere Lösung - gerne auch eine fertige die ein paar Euro kosten darf - wichtig ist nur, dass nicht mehr der Client drucken muss, sondern das von einem zentralen Ort aus geschieht (Stichwort "nur ein PC mit Druckern zu warten")


Ach ja, kleine Anmerkung am Rande: Eigentlich habe ich nichts gegen Windows 10 oder 8/8.1, aber seit Windows 8 scheint Microsoft etwas gegen das drucken auf Papier zu haben, denn ab Windows 8 gingen die Probleme langsam los und wurden bis Windows 10 nicht besser, eher schlimmer. Im Windows 10 (seit der neuen Systemsteuerung/Einstellungen) ist es ja katastrophal, scheinbar haben die Betatester keine Drucker mehr – wir könnte hier auf anhieb 2-3 Buggs in diesen (neuen) Einstellungen aufzählen

__________________

Microsoft Windows 10 Enterprise & Pro, Microsoft Office Professional Plus 2016

Geändert von edv-master (06.10.2017 um 09:46 Uhr).
edv-master ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.10.2017, 16:09   #4
haklesoft
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Stefan,

das Script habe ich etwas umgestellt und erweitert. Beim Start werden jetzt die bereits vorhandenen PDF-Dateien im Pfad (den Du natürlich anpassen musst) abgearbeitet, bevor das Verzeichnis überwacht wird. Die Unterscheidung der lokalen Dateiextensionen musst Du noch einbauen.
Code:

' Script zum Drucken und anschließendem Verschieben von PDF's im benannten Pfad
' Erweiterung durch MSOF/haklesoft
' Stand 06.10.2017
'
Option Explicit	' Variabledeklaration erforderlich

' Konstanten und Variablendeklarationen
Const csDELL = "DELL3765-BCC360-IPv4"
Const csHP = "HPF83790 (HP OfficeJet Pro 8740)"
Const csPara = " /s /h /p /t "

Dim s1BS, s2BS, s4BS
Dim AcroRd32
Dim fso
dim strFolder
dim strUserFolder
dim strNewFile
dim strFileName
dim strMoveFolder
dim strQuellDatei
dim strQuellName
dim strComputer
dim objShell
dim objWMIService
dim colMonitoredEvents
dim objLatestEvent
dim arrNewFile
dim oFolder, oFile


' Hauptprogramm starten
Main

Sub Main()
    ' diese Hilfvariablen nur wegen der Forumsmacke der verschluckten Backspace-Zeichen
    s1BS=  Chr(92)	' 1 Backspace-Zeichen
    s2BS= s1BS & s1BS	' 2 Backspace-Zeichen
    s4BS=s2BS & s2BS	' 4 BackspaceZeichen

    AcroRd32 = "C:" & s1BS & "Program Files (x86)" & s1BS & "Adobe" & s1BS & "Acrobat Reader DC" & s1BS & "Reader" & s1BS & "AcroRd32.Exe"

    Set fso = CreateObject("Scripting.FileSystemObject")
    if not fso.FileExists(AcroRd32) then
	Msgbox AcroRd32, vbCritical , "AcroRd32.Exe NICHT GEFUNDEN"
	WScript.Quit
    end if
    
    strFolder = "C:" & s1BS & "TEMP" & s1BS & "Printing" 'echten Pfad angeben (ohne abschließenden Backspace)
    if not fso.FolderExists(strFolder) then
	Msgbox strFolder, vbCritical , "Printing-Verzeichnis NICHT GEFUNDEN"
	WScript.Quit
    end if

    strMoveFolder = strFolder & s1BS & "Erledigt"	' Verschiebeverzeichnis
    if not fso.FolderExists(strMoveFolder) then
	fso.CreateFolder(strMoveFolder)
    end if
    if not fso.FolderExists(strMoveFolder) then
	Msgbox strMoveFolder, vbCritical , "Erledigt-Verzeichnis NICHT VORHANDEN"
	WScript.Quit
    end if

    Set objShell = CreateObject("Wscript.Shell") 
    strUserFolder = """" & Replace(strFolder, s1BS, s4BS) & """" ' mit 4 BS
    strComputer = "." 

' Abarbeiten aller bereits vorhandenen Dateien im Pfad
    Set oFolder = fso.GetFolder(strFolder)
    For Each oFile In oFolder.Files
  	Call Job(oFile.Path)
    Next
   	
' Ordnerüberwachung
    Set objWMIService = GetObject("winmgmts:" & s2BS & strComputer & s1BS & "root" & s1BS & "cimv2") 
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ 
        ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _ 
          & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _ 
            & "TargetInstance.GroupComponent= " _ 
              & "'Win32_Directory.Name=" & strUserFolder & "'") 
 
    Do
    	Set objLatestEvent = colMonitoredEvents.NextEvent 
	strNewFile = objLatestEvent.TargetInstance.PartComponent 
    	arrNewFile = Split(strNewFile, "=") 
    	strFileName = arrNewFile(1) 
    	strFileName = Replace(strFileName, s2BS, s1BS) 
    	strFileName = Replace(strFileName, Chr(34), "") 
 
    	If strFileName = strFolder & s1BS & "STOP" Then 
            MsgBox "Überwachung von " & strFolder & " wird beendet." 
            WScript.Quit 
        End If 
	Call Job(strFileName) ' jede neue Datei
    Loop
End Sub

' Druck- und Verschieberoutine
Sub Job(sFile)
    Select Case LCase(fso.GetExtensionName(sFile)) 
    Case "pdf" 'Typ in Kleinbuchstaben angeben 
    ' alternative Ausgabe auf einen der zwei Drucker noch programmieren!!!
        'objShell.Run chr(34) & AcroRd32 & chr(34) & csPara & chr(34) & sFile & chr(34) & " " & chr(34) & csDell & chr(34)
    ' alternative Ausgabe auf einen der zwei Drucker noch programmieren!!!
        'objShell.Run chr(34) & AcroRd32 & chr(34) & csPara & chr(34) & sFile & chr(34) & " " & chr(34) & csHP & chr(34)
    ' danach verschieben
	WScript.Sleep(0815)	' etwas warten
	Set strQuellDatei = fso.GetFile(sFile)
	strQuellDatei.Move strMoveFolder & s1BS & strQuellDatei.Name
    Case Else 
    ' keine Aktion erforderlich 
    End Select 
End Sub

__________________

Hang loose, haklesoft
haklesoft ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.