cbli
Goto Top

Alle Dateien mit bestimmter Dateierweiterung ein einem Verzeichnis auf Existenz prüfen

Ich habe ein bereits fertiges lauffähiges Script ,daß ich nun nur noch etwas komfortabler gestalten will.
Ich wollte prüfen lassen

mit FileExists ob Dateien mit bestimmten Endungen in einem bestimmten Verzeichnis existieren (Namen sind nicht bekannt, ich will nur auf Endungen prüfen).


z.B

strOrdner = "d:\exceltemp"

in strordner könnten sich Excel Dateien mit der Endung .xls befinden. Die vollen Namen kenne ich nicht. Daher kann ich ja auch nicht mit FileExists auf ihre Existenz prüfen.
Wie prüfe ich dann nur auf Endungen ? Wildcards gehen nicht oder meine Syntax ist falsch.

Falls dies möglich ist, ist es dann auch möglich in einer schleife verschiedene Dateiendungen auf Existenz zu prüfen, also nicht nur .xls, sonder auch z.b, .doc , .txt , .mdb ,usw......
Vielleicht über ein Array ?

Vielen Dank für die Hilfe

Gruß
Claus

Content-ID: 70399

Url: https://administrator.de/contentid/70399

Ausgedruckt am: 17.11.2024 um 09:11 Uhr

bastla
bastla 08.10.2007 um 17:03:00 Uhr
Goto Top
Hallo cbli!

Kannst Du kurz erklären, was genau Du mit dieser Prüfung vorhast bzw in welcher Form Du deren Ergebnisse benötigst?

Grüße
bastla
bastla
bastla 08.10.2007 um 17:23:28 Uhr
Goto Top
... oder es einfach selbst umsetzen ...

Als Grundgerüst:
Set fso = CreateObject("Scripting.FileSystemObject")  
strOrdner = "d:\exceltemp"  
aTypen = Array("xls", "doc", "txt", "mdb")  
For Each sTyp In aTypen
	bIsDa = False
	For Each oFile In fso.GetFolder(strOrdner).Files
		If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then
			bIsDa = True
			Exit For
		End If
	Next
	If bIsDa Then
		WScript.Echo "Mindestens eine " & sTyp & "-Datei ist vorhanden."  
	Else
		WScript.Echo "Es ist keine " & sTyp & "-Datei vorhanden."	  
	End If
Next

Grüße
bastla
cbli
cbli 08.10.2007, aktualisiert am 29.03.2023 um 23:32:24 Uhr
Goto Top
Hallo cbli!

Kannst Du kurz erklären, was genau Du
mit dieser Prüfung vorhast bzw in
welcher Form Du deren Ergebnisse
benötigst?


Wie ich schon schrieb, nur prüfen ob diese Dateien mit einer Dateiendung (z.B xls) in dem bestimmten Verzeichnis existieren und entprechend eine msgbox oder txtdatei ausgeben mit dem Resultat. Ist nicht zwingend notwendig für mein Script,es läuft auch ohne so wie es soll.
Alles nur Komfort Dinge.
Eventuell interessant wären:

1. Auf Existenz mehrerer verschiedener Dateiendungen auf einmal prüfen

2. Eine Kombination von Punkt 1 mit Abfrage der Dateigröße und damit verbundener
unterschiedlicher Weiterverarbeitung

3. Das Zählen der gefunden Dateien und Ausgabe in txdatei oder msgbox

Punkt 1 + 2 sind eher für zukünftige Scripte gedacht,aber es wäre natürlich auch jetzt schon gut zu wissen wies geht.
Punkt 3 könnte ich für mein jetztiges Script schon verwenden,ist aber auch nicht notwendig.

Hier mal ein Ansatz von mir der nicht funktioniert hat:

sFilename = strOrdner & strExtension 
strExtension = ".xls"  
Set FSO = CreateObject("Scripting.FileSystemObject")  
If FSO.FileExists(strOrdner & strExtension) = False Then
msgbox "Nichts da"  
End If

If FSO.FileExists(strOrdner & strExtension) = true Then
msgbox sFilename
end if    

Vielen Dank für die Hilfe

Gruß
Claus
bastla
bastla 08.10.2007 um 19:14:53 Uhr
Goto Top
Hallo cbli!

Das etwas erweiterte Grundgerüst:
Set fso = CreateObject("Scripting.FileSystemObject")  
strOrdner = "d:\exceltemp"  
aTypen = Array("xls", "doc", "txt", "mdb")  

For Each sTyp In aTypen
	iAnz = 0
	lGr = 0

	For Each oFile In fso.GetFolder(strOrdner).Files
		If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then
			iAnz = iAnz + 1
			lGr = lGr + oFile.Size
		End If
	Next

	Select Case iAnz
	Case 0
		WScript.Echo "Es wurde keine " & sTyp & "-Datei gefunden."	  
	Case 1
		WScript.Echo "Es wurde 1 " & sTyp & "-Datei mit einer Größe von " & FormatNumber(lGr, 0, , , True) & " Bytes gefunden."  
	Case Else
		WScript.Echo "Es wurden " & CStr(iAnz) & " " & sTyp & "-Dateien mit insgesamt " & FormatNumber(lGr, 0, , , True) & " Bytes gefunden."  
	End Select

Next

Grüße
bastla

P.S.: Die Möglichkeit, dass die Gesamtgröße der gefundenen Dateien eines Typs genau 1 Byte beträgt, habe ich vorsätzlich ignoriert ... face-wink
cbli
cbli 10.10.2007 um 16:32:21 Uhr
Goto Top
... oder es einfach selbst umsetzen ...

Als Grundgerüst:
Set fso =
> CreateObject("Scripting.FileSystemObject")  
> strOrdner = "d:\exceltemp"  
> aTypen = Array("xls",  
> "doc", "txt",  
> "mdb")  
> For Each sTyp In aTypen
> 	bIsDa = False
> 	For Each oFile In
> fso.GetFolder(strOrdner).Files
> 		If LCase(fso.GetExtensionName(oFile.Path))
> = sTyp Then
> 			bIsDa = True
> 			Exit For
> 		End If
> 	Next
> 	If bIsDa Then
> 		WScript.Echo "Mindestens eine "  
> & sTyp & "-Datei ist  
> vorhanden."  
> 	Else
> 		WScript.Echo "Es ist keine "  
> & sTyp & "-Datei  
> vorhanden."	  
> 	End If
> Next
> 

Vielen Dank, funktioniert sehr gut.
Noch eine letzte Frage die nach dem Probelauf aufgekommen ist:

Im weiteren Verlauf meines Scripts werden die gefundenen Excel Dateien in ein anderes
Verzeichnis verschoben. Dies funktioniert auch ,nur eben nicht wenn die Dateien im Zielverzeichnis schon existieren. Überschreiben tut er nicht.
Wie kann ich dem Script mitteilen bei dem Move Befehl ein Überschreiben auszuführen,besser noch zu überschreiben wenn die Dateien gleich groß oder größer sind ?
Habe versucht diesen Part noch in die Schleife einzubauen,mein Ansatz hat aber nicht funktioniert.

if oFile.Size(moveordner) >= oFile.Size(zielordner) then

Wie geht das ?

Vielen Dank

Gruß
Claus
bastla
bastla 10.10.2007 um 17:19:02 Uhr
Goto Top
Hallo cbli!

Unter der Voraussetzung, dass "oFile" die Quelldatei darstellt, könntest Du etwa so vorgehen:
If fso.FileExists(ZielOrdner & "\" & oFile.Name) Then  
	Set oOldFile = fso.GetFile(ZielOrdner & "\" & oFile.Name)  
	If oFile.Size >= oOldFile.Size Then
		oOldFile.Delete
		oFile.Move ZielOrdner
	End If
Else
	oFile.Move ZielOrdner
End If

Grüße
bastla
cbli
cbli 10.10.2007 um 18:08:07 Uhr
Goto Top
Hallo cbli!

Kannst Du kurz erklären, was genau Du
mit dieser Prüfung vorhast bzw in
welcher Form Du deren Ergebnisse
benötigst?

Grüße
bastla

Ich habe ein Script (dank deiner Hilfe) geschrieben,daß unteranderem in einem temp Ordner (d:\exceltemp) nach Dateien mit bestimmten Dateiendungen (eine oder auch mehrere) sucht.
Diese dann auf die Größe prüft und sie im weiteren Verlauf des Scripts irgendwann in einen anderen Ordner verschiebt. Das Prüfen auf Existenz von Dateien mit bestimmten Dateiendungen (eine oder auch mehrere) im Ordner war nur eine reine Komfortsache und habe ich inzwischen erfolgreich ins Script integriert.
Wie gesagt irgendwann werden die gefundenen Dateien verschoben und es kann vorkommen,daß ich vergesse vorher die Dateien vom letzten Mal im Zielordner zu löschen.
Einen automatisches Überschreiben scheint es ja nicht zu geben bei VBS.
Natürlich könnte ich vorher den Zielordner per Script leeren lassen,aber dort können sich noch Dateien befinden ,die ich behalten will.
Deshalb wollte ich die Dateien in d:\exceltemp mit denen im Zielordner vergleichen lassen im Hinblick auf die Größe der Dateien.
DateLastModified hilft mir in diesem Fall nicht im Hinblick auf den Inhalt der Dateien. Also nur die Größe vergleichen und wenn sie gleich groß oder größer sind,dann verschieben ansonsten
msgbox "bla bla bla".
Da auto überschreiben nicht geht,wollte ich eben,wenn größere oder gleich große Dateien gefunden wurden,diese vorher im Zielverzeichnis löschen lassen.

Hier mein Ansatz

Set folderZiel= fso.GetFolder("D:\Zielordner\")  
Set oFileZiel = folderziel.Files
strOrdner = "d:\exceltemp\"  


aTypen = Array("xls", "doc")  
For Each sTyp In aTypen
   bIsDa = False
    For Each oFile In fso.GetFolder(strOrdner).Files
        If LCase(fso.GetExtensionName(oFile.Path)) = sTyp then
           bIsDa = True
           if oFile.Size >= oFileZiel.Size(fso.GetFolder(oFileZiel.Path)) then
          wshshell.popup "Eine Datei mit der Erweiterung       " & sTyp & "       wird verschoben" _  
           & vbnewline & vbnewline & "Dateiname:        "  & oFile.name ,1, "Hinweis"  
wshshell.popup "Die Datei:    " & oFile.name & " hat die Größe:   " & oFile.Size & "   <MB" ,2,"Hinweis"  
         oFile.Delete "D:\Zielordner"  
         oFile.Move "D:\Zielordner\"  
          'if oFile.name  
       end if
      End If
    Next
Next
bastla
bastla 10.10.2007 um 19:52:52 Uhr
Goto Top
Hallo cbli!

Nimm Dir einmal etwas Zeit, die Postings in diesem Thread in chronologischer Reihenfolge zu lesen - Du hast gerade auf eine Frage von vorgestern geantwortet ...

Grüße
bastla
cbli
cbli 10.10.2007 um 22:36:22 Uhr
Goto Top
Hallo cbli!

Nimm Dir einmal etwas Zeit, die Postings in
diesem Thread in chronologischer Reihenfolge
zu lesen - Du hast gerade auf eine Frage von
vorgestern geantwortet ...

Grüße
bastla

Oops, mein Fehler. Tut mir leid.
Könnte ein Admin meinen Beitrag an die richtige Stelle verschieben und diesen hier löschen ?

Danke schon mal.

Gruß
Claus
bastla
bastla 10.10.2007, aktualisiert am 18.10.2012 um 18:32:33 Uhr
Goto Top
... und sieh Dir vielleicht auch diesen Beitrag (noch) einmal an ...

Grüße
bastla
cbli
cbli 12.10.2007, aktualisiert am 29.03.2023 um 23:32:45 Uhr
Goto Top
... und sieh Dir vielleicht auch
diesen Beitrag (noch) einmal an ...

Grüße
bastla

So, habe nun Stunden damit zugebracht mein Script zu ändern und zu testen.
Im Grunde funktioniert es, aber nur wenn ich das Script nicht nach der Abfrage (fso.FileExists(zielfolder & "\" & oFile.Name)
in die else Schleife lasse.
Wo ist mein Fehler ?

aTypen = Array("xls", "doc", "txt", "mdb")  

moveordner = "D:\temp\"                ' Hier findet die Verarbeitung statt  
strOrdner = "D:\exceltemp\"           '  Quell Verzeichnis  
zielfolder = "D:\Lager\"                   '  Ziel Verzeichnis  
' oFile   = Dateien in strordner  
' oFileZiel =  Dateien in zielfolder (wenn sie bereits existieren sollten)  

For Each sTyp In aTypen
    bIsDa = False
    For Each oFile In fso.GetFolder(moveordner).Files
        If LCase(fso.GetExtensionName(oFile.Path)) = sTyp then
            bIsDa = True
             If fso.FileExists(zielfolder & "\" & oFile.Name) Then  
                Set oFileZiel = fso.GetFile(zielfolder & "\" & oFile.Name)  
                    If oFile.Size >= oFileZiel.Size Then

        msgbox "Quelldatei:    "  & ofile.name & "    " & ofile.size & "  ist größer / gleich" _  
& vbnewline & "Zieldatei:    " & ofileziel.name & "      " & ofileziel.size ,64,"Hinweis"  
        oFileZiel.Delete
        oFile.Move zielfolder
End If
else
        msgbox "Quelldatei:    "  & ofile.name & "    " & ofile.size & "  ist kleiner" _  
          & vbnewline  & "Zieldatei    " & ofileziel.name & "      " & ofileziel.size ,64,"Hinweis"  

    oFile.Move zielfolder
    oFile.Delete
'End If  
end if
   end if
   next
next

Vielen Dank nochmal für die Geduld

Gruß
Claus
bastla
bastla 12.10.2007 um 13:46:52 Uhr
Goto Top
Hallo cbli!

Im Else-Zweig versuchst Du ja auch ein "oFile.Move zielordner", was angesichts der Tatsache, dass die Datei im Zielordner schon existiert, natürlich scheitert.

Was möchtest Du im Falle, dass die Quelldatei kleiner ist, eigentlich tun - diese löschen? Wenn ja, dann versuch es so:
aTypen = Array("xls", "doc", "txt", "mdb")  

moveordner = "D:\temp\" ' Hier findet die Verarbeitung statt  
strOrdner = "D:\exceltemp\" ' Quell Verzeichnis  
zielfolder = "D:\Lager\" ' Ziel Verzeichnis  
' oFile = Dateien in strordner  
' oFileZiel = Dateien in zielfolder (wenn sie bereits existieren sollten)  

For Each sTyp In aTypen 'Dateitypen  
	For Each oFile In fso.GetFolder(moveordner).Files 'Quelldateien  
		If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then 'Typ  
			If fso.FileExists(zielfolder & "\" & oFile.Name) Then 'Zieldatei  
				Set oFileZiel = fso.GetFile(zielfolder & "\" & oFile.Name)  
				If oFile.Size >= oFileZiel.Size Then 'Dateigröße  
					msgbox "Quelldatei: " & ofile.name & " " & ofile.size & " ist größer / gleich" _  
						& vbnewline & "Zieldatei: " & ofileziel.name & " " & ofileziel.size ,64,"Hinweis"  
					oFileZiel.Delete
					oFile.Move zielfolder
				Else 'Quelldatei kleiner  
					msgbox "Quelldatei: " & ofile.name & " " & ofile.size & " ist kleiner" _  
						& vbnewline & "Zieldatei " & ofileziel.name & " " & ofileziel.size ,64,"Hinweis"  

					oFile.Delete 'Quelldatei löschen  
				End If 'Dateigröße  
			Else 'Zieldatei nicht vorhanden  
				oFile.Move zielfolder
			End If 'Zieldatei  
		End If 'Typ  
	Next 'Quelldateien  
Next 'Dateitypen  

Grüße
bastla

P.S.: Zum Schließen des < code>-Blocks musst Du ein < /code> verwenden ...
cbli
cbli 15.10.2007 um 13:12:32 Uhr
Goto Top
P.S.: Zum Schließen des <
code>-Blocks musst Du ein < /code>
verwenden ...



Hallo Bastla

Danke für den Hinweis und deine Hilfe.

Dieser Beitrag kann jetzt auf gelöst gesetzt werden.

mfg
Claus