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

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:
'  ** Changelog V.1.2 21.12.2011 ***
'  # Parameter am Programmanfang
'  # Abfrage nach Existenz der Ordner
'  # Leerstellen in Pfadangaben
'  # Messages nun in log-Datei

'  ** Changelog V.1.3 22.12.2011 ***
'  # Starten von w2m Timer

' ****** Funktionsbeschreibung *****
' wait2move hat den Zweck, zum einen
' Verzeichnisse auf Inhalt und zum
' anderen die Existenz eines Prozess/
' laufenden Programm zu prüfen.
' Soweit ein bestimmtes Verzeichnis 
' leer und das Programm beendet ist, 
' werden Dateien aus einem anderen 
' Verzeichnis in das leere Verzeichnis
' verschoben und das Programm neu
' gestartet.
' ********************************** 

Dim allProcess 
Dim Process 
Dim foundProcess
Dim ext
Dim datanz
Dim pName
Dim pNam2
Dim pRun
Dim pText
Dim pStart
Dim Path1
Dim Path2
Dim pPath
Dim pPath2
Dim eTime

' ************ Parameter ***********
Path1 = "C:\Spools\"
Path2 = "C:\Temp\"
pPath = "C:\Program Files (x86)\Notepad++\"
pName = "notepad++.exe"
pPath2 = "C:\wait2move\"
pName2 = "w2mTimer.vbs"
eTime = Now

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set allProcess = GetObject ("winmgmts:")
Set pStart = CreateObject("Wscript.Shell")
Set oFile = oFSO.OpenTextFile("C:\wait2move\wait2move.log",8,true)
oFile.WriteLine " "
oFile.WriteLine eTime & " wait2move wurde gestartet"

If oFSO.Folderexists (Path1) = True Then
datanz1 = oFSO.GetFolder(Path1).Files.count
Else
oFile.WriteLine eTime & " Der Ordner " & Path1 & " existiert nicht"
oFile.WriteLine eTime & " wait2move wurde beendet"
oFile.close
pStart.Run Chr(34) & pPath2 & pName2 & Chr(34) 
WScript.Quit
End If

If oFSO.Folderexists (Path2) = True Then
datanz2 = oFSO.GetFolder(Path2).Files.count
Else
oFile.WriteLine eTime & " Der Ordner " & Path2 & " existiert nicht"
oFile.WriteLine eTime & " wait2move wurde beendet"
oFile.close
pStart.Run Chr(34) & pPath2 & pName2 & Chr(34) 
WScript.Quit
End If

foundProcess = False

	For Each Process in allProcess.InstancesOf ("Win32_Process")
		If Process.Name = pName Then
			pRun = 1
			pText = "Der Prozess " & pName & " läuft noch"
			foundProcess = True
			Exit for 
		End If 
	Next
	
If foundProcess = False Then 
pRun = 0
pText = "Der Prozess " & pName & " ist beendet"
End If 
Set allProcess = nothing

oFile.WriteLine eTime & " " & datanz1 & " Datei(en) in der Verarbeitung"
oFile.WriteLine eTime & " " & pText 
oFile.WriteLine eTime & " " & datanz2 & " Datei(en) in der Warteschleife" 

IF pRun = 0 and datanz1 = 0 and datanz2 > 0 Then
oFSO.MoveFile Path2 & "*.pdf", Path1
oFile.WriteLine eTime & " " & datanz2 & " Datei(en) übergeben"
pStart.Run Chr(34) & pPath & pName & Chr(34) 
oFile.WriteLine eTime & " Der Prozess " & pName & " wurde gestartet"
oFile.WriteLine eTime & " wait2move wurde beendet"
oFile.close
pStart.Run Chr(34) & pPath2 & pName2 & Chr(34) 
WScript.Quit
Else
oFile.WriteLine eTime & " Fehler aufgetreten:" 
oFile.WriteLine eTime & " Prozess-Status: "& pRun
oFile.WriteLine eTime & " Dateien in Verarbeitung: "& datanz1 
oFile.WriteLine eTime & " Dateien wartend: "& datanz2
End If
oFile.WriteLine eTime & " wait2move wurde beendet"
oFile.close
pStart.Run Chr(34) & pPath2 & pName2 & Chr(34)
WScript.Quit
 
uh.. ich empfehle dir mit der Tabulator-Taste zu arbeiten um die if..then..else..end sauber zu gestalten.

Visual Basic:
..
If foundProcess = False Then 
	pRun = 0
	pText = "Der Prozess " & pName & " ist beendet"
End If 
Set allProcess = nothing

oFile.WriteLine eTime & " " & datanz1 & " Datei(en) in der Verarbeitung"
oFile.WriteLine eTime & " " & pText 
oFile.WriteLine eTime & " " & datanz2 & " Datei(en) in der Warteschleife" 

IF pRun = 0 and datanz1 = 0 and datanz2 > 0 Then
	oFSO.MoveFile Path2 & "*.pdf", Path1
	oFile.WriteLine eTime & " " & datanz2 & " Datei(en) übergeben"
	pStart.Run Chr(34) & pPath & pName & Chr(34) 
	oFile.WriteLine eTime & " Der Prozess " & pName & " wurde gestartet"
	oFile.WriteLine eTime & " wait2move wurde beendet"
	oFile.close
	pStart.Run Chr(34) & pPath2 & pName2 & Chr(34) 
	WScript.Quit
Else
	oFile.WriteLine eTime & " Fehler aufgetreten:" 
	oFile.WriteLine eTime & " Prozess-Status: "& pRun
	oFile.WriteLine eTime & " Dateien in Verarbeitung: "& datanz1 
	oFile.WriteLine eTime & " Dateien wartend: "& datanz2
End If
..

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

Visual Basic:
Dim type

type = "png"
If oFSO.GetExtensionName(path) = type Then
    '//TODO: Irgendwas
End Ig
 
Hallo,

hab den Gedanken von Yaslaw aufgefasst und so versucht umzusetzten:
PHP:
Dim oFolder1
Dim oFolder2
Dim oFile
Dim nFile
Dim eTime
Dim ext

Set oFSO = CreateObject("Scripting.FileSystemObject")
set oFolder1 = oFSO.GetFolder ("C:\temp")
set oFolder2 = oFSO.GetFolder ("Z:\Input")

eTime = now
ext = "pdf"

For Each oFile In oFolder1.Files
  If oFSO.GetExtensionName(oFile) = ext Then
  MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
	nFile = eTime & "_" & oFile.Name
  MsgBox "Neuer Dateiname: " & nFile
  elseif oFSO.GetExtensionName(oFile) <> ext Then
  oFile.Delete
  End If	
Next

oFSO.MoveFile oFolder1 & "\*.pdf", oFolder2

Set oFSO = nothing	
set oFolder1 = nothing
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.
 
Wo in deinem Code soll denn der Name geändert werden? Irgendwo muss doch noch der Code zum umbennen hin
Visual Basic:
myFile.name = "abc.txt"
'oder
oFSO.getFile("c:\temp\text.txt").name = "nwTest.txt"
 
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:
For Each oFile In oFolder1.Files
  If oFSO.GetExtensionName(oFile) = ext Then
  MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
	oFSO.GetFile("'oFolder1 & '\' & oFile'").Name = eTime & "_" & oFile.Name
  MsgBox "Neuer Dateiname: " & oFile
  elseif oFSO.GetExtensionName(oFile) <> ext Then
  oFile.Delete
  End If	
Next
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:
Dir ist klar, dass du mit obigem Code bei beispielsweise 100 Dateien, welche dem Suchkriterium entsprechen, 200 MsgBoxes beantworten musst?
 
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.
 
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:
'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]
Visual Basic:
For Each oFile In oFolder1.Files
	If oFSO.GetExtensionName(oFile) = ext Then
		MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
		'neuer Dateinamen zusammensetzen
		newName = eTime & "_" & oFile.Name
		'Datei umbenennen
		oFile.name = newName
		MsgBox "Neuer Dateiname: " & newName
	else
		oFile.Delete
	End If    
Next
 
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
Visual Basic:
Dim oFolder1
Dim oFolder2
Dim oFile
Dim eTime
Dim ext

Set oFSO = CreateObject("Scripting.FileSystemObject")
set oFolder1 = oFSO.GetFolder ("C:\temp")
set oFolder2 = oFSO.GetFolder ("Z:\Input")

eTime = now
ext = "pdf"

For Each oFile In oFolder1.Files
    If oFSO.GetExtensionName(oFile) = ext Then
        MsgBox ext & "-Datei: " & oFile.Name & " gefunden"
        'neuer Dateinamen zusammensetzen
        newName = eTime & "_" & oFile.Name
        'Datei umbenennen
        oFile.name = newName
        MsgBox "Neuer Dateiname: " & newName
    else
        oFile.Delete
    End If    
Next  

oFSO.MoveFile oFolder1 & "\*.pdf", oFolder2

Set oFSO = nothing	
set oFolder1 = nothing
set oFolder2 = nothing
 
Zurück