1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[VBScript] Nur Dateien mit einen bestimmten Extension zählen

Dieses Thema im Forum "Visual Basic 6.0, VBA & VBScript" wurde erstellt von amn.ssy, 22. Dezember 2011.

  1. amn.ssy

    amn.ssy Erfahrenes Mitglied

    Hallo,

    wie kann ich den nachfolgenden Code so ergänzen, daß nur Dateien mit einer bestimmten Endung (*.pdf) gezählt werden. Idealerweise möchte ich die ext. ebenfalls über Varialben/konstanten pflegen können. Zur werden noch alle Dateien gezählt.
    Bis dahin kam ich mit Google und eigenem "Gripps" ganz gut hin, aber seh ich gerade den Wald vor Bäumen nicht mehr.

    Bestimmt geht das Ganze noch eleganter zu lösen (z.B. mit Funktionen für die Prüfungen oder das Sammeln des Outputs in einem Array um die Log erst am Schluss in einem Rutsch zu schreiben). Zukunftsmusik (sie klingt schon in meinen Ohren) wäre die "Konstanten" in einer ini-Datei zu pflegen. Aber bis dahin bin ich schon ganz froh das bisherige geschafft zu haben.
    (Das Programm Notepad++ ist nur ein Platzhalter, weil ich das Eigendliche grad nicht auf meiner Mühle zum laufen bekomme)

    PHP:
    1. '  ** Changelog V.1.2 21.12.2011 ***
    2. '  # Parameter am Programmanfang
    3. '  # Abfrage nach Existenz der Ordner
    4. '  # Leerstellen in Pfadangaben
    5. '  # Messages nun in log-Datei
    6.  
    7. '  ** Changelog V.1.3 22.12.2011 ***
    8. '  # Starten von w2m Timer
    9.  
    10. ' ****** Funktionsbeschreibung *****
    11. ' wait2move hat den Zweck, zum einen
    12. ' Verzeichnisse auf Inhalt und zum
    13. ' anderen die Existenz eines Prozess/
    14. ' laufenden Programm zu prüfen.
    15. ' Soweit ein bestimmtes Verzeichnis
    16. ' leer und das Programm beendet ist,
    17. ' werden Dateien aus einem anderen
    18. ' Verzeichnis in das leere Verzeichnis
    19. ' verschoben und das Programm neu
    20. ' gestartet.
    21. ' **********************************
    22.  
    23. Dim allProcess
    24. Dim Process
    25. Dim foundProcess
    26. Dim ext
    27. Dim datanz
    28. Dim pName
    29. Dim pNam2
    30. Dim pRun
    31. Dim pText
    32. Dim pStart
    33. Dim Path1
    34. Dim Path2
    35. Dim pPath
    36. Dim pPath2
    37. Dim eTime
    38.  
    39. ' ************ Parameter ***********
    40. Path1 = "C:\Spools\"
    41. Path2 = "C:\Temp\"
    42. pPath = "C:\Program Files (x86)\Notepad++\"
    43. pName = "notepad++.exe"
    44. pPath2 = "C:\wait2move\"
    45. pName2 = "w2mTimer.vbs"
    46. eTime = Now
    47.  
    48. Set oFSO = CreateObject("Scripting.FileSystemObject")
    49. Set allProcess = GetObject ("winmgmts:")
    50. Set pStart = CreateObject("Wscript.Shell")
    51. Set oFile = oFSO.OpenTextFile("C:\wait2move\wait2move.log",8,true)
    52. oFile.WriteLine " "
    53. oFile.WriteLine eTime & " wait2move wurde gestartet"
    54.  
    55. If oFSO.Folderexists (Path1) = True Then
    56. datanz1 = oFSO.GetFolder(Path1).Files.count
    57. Else
    58. oFile.WriteLine eTime & " Der Ordner " & Path1 & " existiert nicht"
    59. oFile.WriteLine eTime & " wait2move wurde beendet"
    60. oFile.close
    61. pStart.Run Chr(34) & pPath2 & pName2 & Chr(34)
    62. WScript.Quit
    63. End If
    64.  
    65. If oFSO.Folderexists (Path2) = True Then
    66. datanz2 = oFSO.GetFolder(Path2).Files.count
    67. Else
    68. oFile.WriteLine eTime & " Der Ordner " & Path2 & " existiert nicht"
    69. oFile.WriteLine eTime & " wait2move wurde beendet"
    70. oFile.close
    71. pStart.Run Chr(34) & pPath2 & pName2 & Chr(34)
    72. WScript.Quit
    73. End If
    74.  
    75. foundProcess = False
    76.  
    77.     For Each Process in allProcess.InstancesOf ("Win32_Process")
    78.         If Process.Name = pName Then
    79.             pRun = 1
    80.             pText = "Der Prozess " & pName & " läuft noch"
    81.             foundProcess = True
    82.             Exit for
    83.         End If
    84.     Next
    85.    
    86. If foundProcess = False Then
    87. pRun = 0
    88. pText = "Der Prozess " & pName & " ist beendet"
    89. End If
    90. Set allProcess = nothing
    91.  
    92. oFile.WriteLine eTime & " " & datanz1 & " Datei(en) in der Verarbeitung"
    93. oFile.WriteLine eTime & " " & pText
    94. oFile.WriteLine eTime & " " & datanz2 & " Datei(en) in der Warteschleife"
    95.  
    96. IF pRun = 0 and datanz1 = 0 and datanz2 > 0 Then
    97. oFSO.MoveFile Path2 & "*.pdf", Path1
    98. oFile.WriteLine eTime & " " & datanz2 & " Datei(en) übergeben"
    99. pStart.Run Chr(34) & pPath & pName & Chr(34)
    100. oFile.WriteLine eTime & " Der Prozess " & pName & " wurde gestartet"
    101. oFile.WriteLine eTime & " wait2move wurde beendet"
    102. oFile.close
    103. pStart.Run Chr(34) & pPath2 & pName2 & Chr(34)
    104. WScript.Quit
    105. Else
    106. oFile.WriteLine eTime & " Fehler aufgetreten:"
    107. oFile.WriteLine eTime & " Prozess-Status: "& pRun
    108. oFile.WriteLine eTime & " Dateien in Verarbeitung: "& datanz1
    109. oFile.WriteLine eTime & " Dateien wartend: "& datanz2
    110. End If
    111. oFile.WriteLine eTime & " wait2move wurde beendet"
    112. oFile.close
    113. pStart.Run Chr(34) & pPath2 & pName2 & Chr(34)
    114. WScript.Quit
     
  2. Yaslaw

    Yaslaw n/a Moderator

    uh.. ich empfehle dir mit der Tabulator-Taste zu arbeiten um die if..then..else..end sauber zu gestalten.

    Code (Visual Basic):
    1. ..
    2. If foundProcess = False Then
    3.     pRun = 0
    4.     pText = "Der Prozess " & pName & " ist beendet"
    5. End If
    6. Set allProcess = nothing
    7.  
    8. oFile.WriteLine eTime & " " & datanz1 & " Datei(en) in der Verarbeitung"
    9. oFile.WriteLine eTime & " " & pText
    10. oFile.WriteLine eTime & " " & datanz2 & " Datei(en) in der Warteschleife"
    11.  
    12. IF pRun = 0 and datanz1 = 0 and datanz2 > 0 Then
    13.     oFSO.MoveFile Path2 & "*.pdf", Path1
    14.     oFile.WriteLine eTime & " " & datanz2 & " Datei(en) übergeben"
    15.     pStart.Run Chr(34) & pPath & pName & Chr(34)
    16.     oFile.WriteLine eTime & " Der Prozess " & pName & " wurde gestartet"
    17.     oFile.WriteLine eTime & " wait2move wurde beendet"
    18.     oFile.close
    19.     pStart.Run Chr(34) & pPath2 & pName2 & Chr(34)
    20.     WScript.Quit
    21. Else
    22.     oFile.WriteLine eTime & " Fehler aufgetreten:"
    23.     oFile.WriteLine eTime & " Prozess-Status: "& pRun
    24.     oFile.WriteLine eTime & " Dateien in Verarbeitung: "& datanz1
    25.     oFile.WriteLine eTime & " Dateien wartend: "& datanz2
    26. End If
    27. ..
    Nun zu deiner Frage.
    Obs mit VBScript geht, weiss ich grad nicht. Aber 95% von VBA geht auch mit VBScript. Darum hier mal ein Lösungsansatz mit GetExtensionName() des FileSystemObjects

    Code (Visual Basic):
    1. Dim type
    2.  
    3. type = "png"
    4. If oFSO.GetExtensionName(path) = type Then
    5.     '//TODO: Irgendwas
    6. End Ig
     
  3. MarcoIT

    MarcoIT Grünschnabel

    Hihi

    Aber Yaslaw war bereits schneller...
    type musst du halt dann in pdf abändern

    LG
    Marco
     
  4. amn.ssy

    amn.ssy Erfahrenes Mitglied

    Hallo,

    hab den Gedanken von Yaslaw aufgefasst und so versucht umzusetzten:
    PHP:
    1. Dim oFolder1
    2. Dim oFolder2
    3. Dim oFile
    4. Dim nFile
    5. Dim eTime
    6. Dim ext
    7.  
    8. Set oFSO = CreateObject("Scripting.FileSystemObject")
    9. set oFolder1 = oFSO.GetFolder ("C:\temp")
    10. set oFolder2 = oFSO.GetFolder ("Z:\Input")
    11.  
    12. eTime = now
    13. ext = "pdf"
    14.  
    15. For Each oFile In oFolder1.Files
    16.   If oFSO.GetExtensionName(oFile) = ext Then
    17.   MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
    18.     nFile = eTime & "_" & oFile.Name
    19.   MsgBox "Neuer Dateiname: " & nFile
    20.   elseif oFSO.GetExtensionName(oFile) <> ext Then
    21.   oFile.Delete
    22.   End If   
    23.  
    24. oFSO.MoveFile oFolder1 & "\*.pdf", oFolder2
    25.  
    26. Set oFSO = nothing 
    27. set oFolder1 = nothing
    28. set oFolder2 = nothing
    Ich bekomme zwar keine Fehlermeldung, jedoch wird der Dateiname nicht geändert!
    Was fehlt?
    Sinn und Zweck der "Übung" geht dahin, alle PDF-Dateien im Ordner umzubennen (Datun_Dateiname.pdf) und diese dann in ein andernen Ordner zu verschieben, alle anderen dateien werden gelöscht.
     
  5. Yaslaw

    Yaslaw n/a Moderator

    Wo in deinem Code soll denn der Name geändert werden? Irgendwo muss doch noch der Code zum umbennen hin
    Code (Visual Basic):
    1. myFile.name = "abc.txt"
    2. 'oder
    3. oFSO.getFile("c:\temp\text.txt").name = "nwTest.txt"
     
  6. amn.ssy

    amn.ssy Erfahrenes Mitglied

    Hallo,

    danke für den Tipp, dennoch stehe ich etwas auf'm Schlauch.
    Das Beispiel ist ja für eine einzelne Datei gedacht.
    Wie bekomme ich das dynamisch hin?
    Ich habs jetzt mal so versucht und denke, daß es zumindest in diese Richtung gehen müßte, wenn ich das Beispiel richt verstanden habe. Syntaktisch scheint das aber nicht zu stimmen.
    PHP:
    1. For Each oFile In oFolder1.Files
    2.   If oFSO.GetExtensionName(oFile) = ext Then
    3.   MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
    4.     oFSO.GetFile("'oFolder1 & '\' & oFile'").Name = eTime & "_" & oFile.Name
    5.   MsgBox "Neuer Dateiname: " & oFile
    6.   elseif oFSO.GetExtensionName(oFile) <> ext Then
    7.   oFile.Delete
    8.   End If   
    Jedenfalls bleibe ich gleich nach der ersten MsgBox (ist nur als Debug-Hilfsmittel gedacht) hängen:
    "Datei nicht gefunden". Da ist aber in jedem Fall eine PDF im Ordner.
     
    Zuletzt bearbeitet: 18. Januar 2012
  7. Zvoni

    Zvoni Erfahrenes Mitglied

    Dir ist klar, dass du mit obigem Code bei beispielsweise 100 Dateien, welche dem Suchkriterium entsprechen, 200 MsgBoxes beantworten musst?
     
  8. amn.ssy

    amn.ssy Erfahrenes Mitglied

    MsgBoxen dieser Art mach ich nur als Debug-Hilfsmittel rein um festzustellen bis wohin das Script arbeitet und ggf. welche Werte meine Variablen haben.
    I.d.R gehe ich damit sehr dossiert um, da die meisten Sachen die ich mache unbeaufsichtigt laufen müssen und ich die da natürlich nicht gebrauchen kann.
     
  9. Yaslaw

    Yaslaw n/a Moderator

    Du machst da ein wenig Chaos.

    item: oFile ist ein Objekt. Ergo macht MsgBox "Neuer Dateiname: " & oFile wenig Sinn. Wenn du den Filenamen haben willst, dann solltest du auf die Eigenschaft 'name' des Objektes zugreiffen.
    MsgBox "Neuer Dateiname: " & oFile.name

    item: oFSO.GetFile("'oFolder1 & '\' & oFile'"): Was ist das für ein komischer Pfad?Es gibt glaub kein Pfad der so heisst
    Code (Text):
    1. 'oFolder1 & '\' & oFile'
    Zudem brauchst du da getFile() nicht. Du hast ja bereits das File in dem Objekt oFile.

    item: Wenn du einen String, in deinem Beispiel den neuen Filenamen mehrfach brauchst, solltest du ihn in eine Variable setzen und nicht mehrmals neu zusammenstellen. Die Fehlerquelle ist damit erheblich reduziert

    item: Es reicht ein einfaches else. Dein elseif prüft genau das gegenteil vom If. Ergo wenns nicht in den ersten Teil kommt, kommts automatisch in den Zweiten

    item: Für VB-Code gibts in diesem Forum eigene Tags. Du musst nicht die für PHP verwenden.
    [code=vb]Dein Code[/code]
    Code (Visual Basic):
    1. For Each oFile In oFolder1.Files
    2.     If oFSO.GetExtensionName(oFile) = ext Then
    3.         MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
    4.         'neuer Dateinamen zusammensetzen
    5.         newName = eTime & "_" & oFile.Name
    6.         'Datei umbenennen
    7.         oFile.name = newName
    8.         MsgBox "Neuer Dateiname: " & newName
    9.     else
    10.         oFile.Delete
    11.     End If    
    12. Next
     
  10. amn.ssy

    amn.ssy Erfahrenes Mitglied

    Hi,

    ich hab den Code mal versucht so zu übernehmen (so ähnlich hatte ich das schon mal),
    lauf aber in die Fehlermeldung "Ungültige(r) Dateiname o. -nummer" in 20,9
    Code (Visual Basic):
    1. Dim oFolder1
    2. Dim oFolder2
    3. Dim oFile
    4. Dim eTime
    5. Dim ext
    6.  
    7. Set oFSO = CreateObject("Scripting.FileSystemObject")
    8. set oFolder1 = oFSO.GetFolder ("C:\temp")
    9. set oFolder2 = oFSO.GetFolder ("Z:\Input")
    10.  
    11. eTime = now
    12. ext = "pdf"
    13.  
    14. For Each oFile In oFolder1.Files
    15.     If oFSO.GetExtensionName(oFile) = ext Then
    16.         MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
    17.         'neuer Dateinamen zusammensetzen
    18.        newName = eTime & "_" & oFile.Name
    19.         'Datei umbenennen
    20.        oFile.name = newName
    21.         MsgBox "Neuer Dateiname: " & newName
    22.     else
    23.         oFile.Delete
    24.     End If    
    25. Next  
    26.  
    27. oFSO.MoveFile oFolder1 & "\*.pdf", oFolder2
    28.  
    29. Set oFSO = nothing 
    30. set oFolder1 = nothing
    31. set oFolder2 = nothing
     
  11. Yaslaw

    Yaslaw n/a Moderator

    Und wie sieht der neue Name aus?
     
  12. amn.ssy

    amn.ssy Erfahrenes Mitglied

    Jeder Datei im Verzechnis mit der Extension .PDF soll das aktuelle Datum (now) voran gestellt werden.

    (Dateiname.pdf -> 18.01.2012_Dateiname.pdf)

    Hab die MsgBox mal direkt unter die newName Zuweisung gesetzt - der Inhalt von newName ist richtig. Offensichtlich mag "er" oFile.name nicht bzw. es steht nicht das drin was erwartet wird.
    Das andere ist, daß mit dieser Zuweisung (soweit war ich ja schon mal) ja noch nicht der neue Name auch gespeichert wird.
    Idee (gerade eben): kann ich nicht den move-Befehl "missbrauchen"?

    z.B. oFSO.MoveFile oFolder1 & "\*.pdf", oFolder2 & "\" & newName

    Das ganz müßte dann natürlich in die Schleife und hätte den Vorteil, daß ich nicht erst umständlich alle pdf-Dateien umbenenne und dann verschiebe, sondern gleich wenn Sie gefunden werden, mit neuem Namen ins andere Verzeichnis wandern.
     
  13. Yaslaw

    Yaslaw n/a Moderator

    oFile.name sollte schon stimmen. Ev. hat er mit den Punkten im Filenamen Problem. Ich teste das morgen mal
     
  14. Zvoni

    Zvoni Erfahrenes Mitglied

    Dein Problem ist die Verwendung von

    Code (Visual Basic):
    1. eTime=now
    "Now" ohne Formatierung gibt nämlich "dd.mm.yyyy hh:mm:ss" zurück, und Doppelpunkte im Dateinamen.......

    Deine Magie muss lauten:

    Code (Visual Basic):
    1. eTime=Format(Now,"dd.mm.yyyy")
     
  15. Yaslaw

    Yaslaw n/a Moderator

    Mit der Zuweisung ist automatisch der neue Name gespeichert - mindestens bei all meinen Tests

    Code (Visual Basic):
    1. 'Mein Test der funktioniert
    2.    Dim f   As File
    3.     Set f = fso.GetFile("C:\LocalData\Temp\1.1.1.test10.txt")
    4.     f.Name = "1.1.1.test.txt"
    5.     Set f = Nothing

    item: now() direkt als String auswerten ist sehr suboptimal. Am besten mittels format() in ein String_fromat bringen. Wenn du da noch die Reihenfolge Jahr_Monat_Tag wählst, kriegst du eine Dateiname der nach Datum sortierbar ist: 2012_01_19
    Code (Visual Basic):
    1. sTime = format(now, "YYYY_MM_DD")
    item: Das mit dem Move geht auch. Aber auch da gilt. oFolder sind Objekte und keine Strings. Wenn du den Pfad des Ordners brauchst, dann kannst du mit oFolder1.path darauf zugreifen. Und um einen Pfad zu erstellen empfiehlt es sich die FSO-Methode BuildPath() zu verwenden.

    item: Den Move kannst du auch direkt aus dem File-Objekt oFile machen.
    Code (Visual Basic):
    1. sTime =  format(now, "YYYY_MM_DD")
    2. ....
    3.     newName = sTime & "_" & oFile.name
    4.     Call oFile.move(oFSO.buildPath(oFilder2.path, newName))
    Mein Script das funktioniert sieht gerade so aus
    Code (Visual Basic):
    1.     Dim sDate               As String
    2.     Dim sNewName            As String
    3.     Dim oFile               As Object
    4.     Dim oFolderSource       As Object
    5.     Dim oFSO                As Object
    6.    
    7.     Set oFSO = CreateObject("Scripting.FileSystemObject")
    8.    
    9.     sDate = Format(Now, "YYYY_MM_DD_")
    10.     For Each oFile In oFSO.GetFolder("C:\LocalData\Temp\test").Files
    11.         If oFSO.GetExtensionName(oFile.Path) = "pdf" Then
    12.             sNewName = sDate & oFile.Name
    13.             oFile.Copy (oFSO.BuildPath("C:\LocalData\Temp\test\sub", sNewName))
    14.         End If
    15.     Next oFile
    16.  
    17.     Set oFSO = Nothing
     

Diese Seite empfehlen