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