Anzeige

 VBS: alle PDF-Dateien in einem Ordner gleichzeitig öffnen


Juwee

Grünschnabel
#1
Hallo,
ich habe in deiner Ordnerstruktur (.\Tagesberichte\xx.18\) mehrere dynamische PDF-Formulare (mit LCD erstellt). Die Berichtsformulare sind im Layout alle gleich (da Klientenbezogen), unterscheiden sich nur inhaltlich.
Um den Kollegen morgens zu ersparen alle Dateien einzeln zu öffnen, würde ich das gerne mit einem Script erledigen. Als Standard ist der Acrobat-Reader DC installiert.
Kann mir da jemand auf die Sprünge helfen oder hat vielleicht auch eine andere Idee?
Ich dachte vor geraumer Zeit auch schon mal an eine Art "Verwaltungsoberfläche" in VB die mir in einem linken Fenster die verfügbaren PDF-Dateien anzeigt (als Links o.ä.), im rechten Fenster den Inhalt des Formulars.
Da es sich dabei jedoch um dyn. XML-Formulare handelt befürchte ich, daß das wohl so nicht funktioniert - zumindest spuckte Google mir keinen Ansatz aus, der in diese Richtung geht. Oder geht's vielleicht doch? ;)
Daher nun die Idee mit dem VBS, das auf einem Schlag alle Dateien öffnen soll.

Lieben Dank im Voraus für eure Ideen,
Juwee
 

Juwee

Grünschnabel
#2
So funktioniert das fürs Erste :)
Visual Basic:
dim fso,shell,file
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("Wscript.Shell")
for each file in fso.GetFolder("c:\Ordner").Files
     if LCase(fso.GetExtensionName(file.Name)) = "pdf" then
         shell.Run """" & file.Path & """",1,False
     End if
Next
Wo und wie muss ich das anpassen, daß jeweils der jüngste Ordner genommen wird, damit ich das Script nicht jeden Monat anpassen muss?
Meine Ordnerstruktur folgt z.B. ".\Tagesberichte\01.18". Am 01.02. wird automatisch unterhalb von Tagesberichte der Ordner 02.18 angelegt, zum 01.03. der Ordner 03.18 usw.
 
Zuletzt bearbeitet von einem Moderator:

Yaslaw

n/a
Moderator
#3
01.18, 02.18.. Schlechte Idee
Normalerweise macht man Die Ordnerformate in JJJJMMDD oder JJMM in deinem Fall. Dann ist das ganze Sortierbar. Der letzte Ordner ist der neueste.
In Deinem Fall währe das 1801 1802 etc.
OK, du hast schon die technisch nicht gut verwertbaren Ordner.
Dann musst du halt alle Ordnernamen auslesen. Jeden Ordnernamen nach Jahr und Monat aufdröseln. Diese Sortieren und davon den höchsten nehmen.
Visual Basic:
Public Sub Test_T406274()
    Dim folderNames() As Variant
    Dim sortableName As String
    Dim maxSortName As String
    Dim i As Long
    Dim maxI As Long
   
    'Beispieldaten
    folderNames = Array("01.18", "05.18", "03.18")
   
    'Alle Ordner durchiterieren
    For i = 0 To UBound(folderNames)
        'Die Ordnernamen ins ein sortierbares Format bringen: JJMM
        sortableName = Right(folderNames(i), 2) & Left(folderNames(i), 2)
        'Sortierbarer Name vergleichen und ggf. übernehmen
        If sortableName > maxSortName Then
            maxSortName = sortableName
            maxI = i
        End If
    Next i
   
    'Letzter Datumsordner auswählen
    Debug.Print folderNames(maxI)
   
End Sub
 

ComFreek

Mod | @comfreek
Moderator
#4
Ich dachte vor geraumer Zeit auch schon mal an eine Art "Verwaltungsoberfläche" in VB die mir in einem linken Fenster die verfügbaren PDF-Dateien anzeigt (als Links o.ä.), im rechten Fenster den Inhalt des Formulars.
Vielleicht findest du für PowerShell oder .NET eine Bibliothek zum Inspizieren von PDFs und deren Formularen. Eine GUI in PowerShell zu bauen ist relativ schnell (dafür aber Quick & Dirty) möglich, siehe z. B. https://poshgui.com/
 

Juwee

Grünschnabel
#5
Moin zusammen,
ich bin mittlerweile zu einer praktikablen Lösung (wenn auch nicht ganz auf eigenem Mist gewachsen) gekommen, obgleich ich zugeben muß, daß ich die Ordnerstruktur tatsächlich hätte anders aufbauen können ;)

Code:
dim fso,shell,file,folder,username
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("Wscript.Shell")
Const ROOTFOLDER = "C:\Users\...\Dropbox\FP\Tagesberichte"
folder = getNewestFolder(ROOTFOLDER)

If folder <> "" Then
    For Each file In fso.GetFolder(folder).Files
         If LCase(fso.GetExtensionName(file.Name)) = "pdf" then
             shell.Run """" & file.Path & """",1,False
         End if
    Next
End If

Function getNewestFolder(strPath)
        dim objList, f
    Set objList = CreateObject("ADOR.Recordset")
    objList.Fields.Append "name", 200, 255
    objList.Fields.Append "date", 7
    objList.Open
    If fso.FolderExists(strPath) then
        For Each f In fso.GetFolder(strPath).SubFolders
            objList.AddNew
            objList("name").Value = f.Path
            objList("date").Value = f.DateCreated
            objList.Update
        Next
    End If
    objList.Sort = "date DESC"
    If objList.RecordCount > 0 Then
        objList.MoveFirst
        getNewestFolder = objList.Fields("name").Value
    Else
        getNewestFolder = ""
    End If
    Set objList = Nothing
End Function
Um noch etwas mehr Flexibilität hinzuzufügen versuchte ich gestern an die Stelle bei an der der Username steht, diesen auch reinzubekommen.
Versucht habe ich es derart:

Code:
dim fso,shell,file,folder,Username
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("Wscript.Shell")
Username = WshShell.ExpandEnvironmentStrings("%UserName%")
Const ROOTFOLDER = "C:\Users\" & Username & "\Dropbox\FP\Tagesberichte"
folder = getNewestFolder(ROOTFOLDER)
...
Leider meckert das System nun die Zeile 5 an und ich versteh nicht so recht warum!?
Wie muß ich den Code anpassen, damit ich den Benutzer da rein bekomm?

Grüße, Juwee
 

Juwee

Grünschnabel
#7
Hallo Yaslaw, danke für den Tipp :)

Mittlerweile hab ich das so fertig gemacht und es funktioniert ;)

Visual Basic:
dim fso,shell,file,folder,profile
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("Wscript.Shell")
profile = shell.ExpandEnvironmentStrings("%USERPROFILE%")
ROOTFOLDER = profile & "\Dropbox\xxx\yyy"
folder = getNewestFolder(ROOTFOLDER)

If folder <> "" Then
    For Each file In fso.GetFolder(folder).Files
         If LCase(fso.GetExtensionName(file.Name)) = "pdf" then
             shell.Run """" & file.Path & """",1,False
         End if
    Next
End If

Function getNewestFolder(strPath)
        dim objList, f
    Set objList = CreateObject("ADOR.Recordset")
    objList.Fields.Append "name", 200, 255
    objList.Fields.Append "date", 7
    objList.Open
    If fso.FolderExists(strPath) then
        For Each f In fso.GetFolder(strPath).SubFolders
            objList.AddNew
            objList("name").Value = f.Path
            objList("date").Value = f.DateCreated
            objList.Update
        Next
    End If
    objList.Sort = "date DESC"
    If objList.RecordCount > 0 Then
        objList.MoveFirst
        getNewestFolder = objList.Fields("name").Value
    Else
        getNewestFolder = ""
    End If
    Set objList = Nothing
End Function
Vielleicht kanns ja jemand brauchen oder es dient als Ansatz für ähnliche Zwecke.

Grüße, Uwe
 
Zuletzt bearbeitet von einem Moderator:
Anzeige

Neue Beiträge

Anzeige