lionne
Goto Top

Zwei Ordner durchsuchen

wie kann ich mit vbs zwei Ordnern durchsuchen? Ich habe die Ordner "D:\test\" und "E:\Beispiele\", die ich per vbs durchsuchen möchte um zu prüfen, ob eine pdf Datei erhalten ist. Ich kann es für einen Ordner machen.

Für zwei habe als Idee noch ein Sub zu schreiben, aber das ist nicht schön.

Hat Jemand eine Idee, wie ich es in eine Routine für beide Ordner hin bekomme?

Danke im Voraus
Lionne

Content-Key: 174525

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

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: bastla
bastla 12.10.2011 um 10:41:57 Uhr
Goto Top
Hallo lionne!

Die Suche muss für jeden Ordner einzeln erfolgen - ob als "Sub" (oder "Function" - noch hast Du den Sinn der Aktion nicht beschrieben sorry, nicht genau genug gelesen face-sad) oder als Schleife über ein "Array()" von Suchzielen bleibt letztlich Dir überlassen ...

Grüße
bastla
Mitglied: colinardo
colinardo 12.10.2011 um 10:50:06 Uhr
Goto Top
Hier eine Möglichkeit:
set objFS = Wscript.CreateObject("Scripting.FileSystemObject")  
set f1 = objFS.GetFolder("c:\temp\f1")  
set f2 = objFS.GetFolder("c:\temp\f2")  
suchObjekt = "NachdiesemPDFsucheich.pdf"  
if parseFolder(f1) = true or parseFolder(f2) = true then
	wscript.Echo "Found"  
else
	wscript.Echo "Not Found"  
end if

Function parseFolder(fldr)
	dim found
	For each file in fldr.Files
		if file.name = suchObjekt then
			parseFolder = true
			exit function
		end if	
	Next
	
	For Each subFolder in fldr.SubFolders
		if parseFolder(subFolder) = true then
			parseFolder = true
			exit function
		end if
	Next
	
End Function
Mitglied: lionne
lionne 12.10.2011 um 16:02:21 Uhr
Goto Top
Hallo bastla,

danke für deine Antwort. Wenn ich das Skript ausführe, bekomme ich folgende Fehlermeldung:
"Object required 'fldr' ". Obwohl ich 'fldr' als als Dim declariert habe.

Danke
Lionne
Mitglied: colinardo
colinardo 12.10.2011 um 16:26:22 Uhr
Goto Top
'fldr' wird nur innerhalb der Function verwendet. Sie braucht nicht deklariert werden.
Wahrscheinlich hast du bei der Angabe der Ordner einen Fehler eingebaut. Wenn die GetFolder Methode fehlschlägt ist 'fldr' leer und die Function schlägt fehl.
Hoffe du hast das Script nicht nur einfach kopiert und ausgeführt. Du musst es natürlich an deine Gegebenheiten anpassen. Variable "F1" und "F2" sind die Ordner in denen du suchst und "suchObjekt" der Name der PDF Datei.
Mitglied: lionne
lionne 12.10.2011 um 16:49:03 Uhr
Goto Top
Hallo Softmeister,

natürlich habe ich das Skript angepasst. Aber ich bekomme immer die Fehlermeldung: "Object required 'fldr" an der Stelle
 For each file in fldr.Files 
Mitglied: bastla
bastla 12.10.2011 um 16:54:50 Uhr
Goto Top
Hallo lionne!

Wäre es dann nicht sinnvoll, Deine aktuelle Version des Scripts zu posten?

Grüße
bastla
Mitglied: colinardo
colinardo 12.10.2011 um 17:12:04 Uhr
Goto Top
Das Script funktioniert so, da muss der Fehler in einer deiner Anpassungen stecken , bitte poste das ganze Script...
Mitglied: lionne
lionne 12.10.2011 um 17:14:50 Uhr
Goto Top
Hallo bastla,

mein code

Gruß
Lionne

    Dim targetType

set objFS = Wscript.CreateObject("Scripting.FileSystemObject")  
set f1 = objFS.GetFolder("E:\test1")  
set f2 = objFS.GetFolder("D:\PdfFile")  

targetType = "pdf"  
if parseFolder(f1) = true or parseFolder(f2) = true then
	wscript.Echo "Found"  
else
	wscript.Echo "Not Found"  
end if

Sub parseFolder(fldr)
	dim found
	For each file in fldr.Files
		
		If LCase(fldr.GetExtensionName(file.Name)) = LCase(targetType) Then
			if file.DateCreated = currentDate then
				'parseFolder = true  
				WScript.echo file.DateCreated
				'send a message  
			End if
			
		End if	
	Next
	
	
End sub
Mitglied: Biber
Biber 12.10.2011 um 22:26:17 Uhr
Goto Top
Na ja, lionne,

VBS-Schnipsel sind ja nicht gerade mein Fachgebiet, aber ganz so robust erscheint mir dein Entwurf ja nicht.

a) Als parseFolder-Function wie im ersten Entwurf von Softmeister liesse sich ja ein True/Fals-Returnwert auswerten.
Als Sub parseFolder wird das schwierig

b) Ein "fldr.GetExtensionName(file.Name))" geht in die Grütze, weil GetExtensionName() eine Methode des FileSystemObjects ist.
Aber keine des Folder-Objects.

c) ein Vergleich "file.DateCreated" mit "currentDate" (WTF??), aber auch mit "Date" geht daneben, weil file.DateCreated Datum und Zeit beinhaltet. Also quasi "tt.mm.jjjj hh:mm:ss" plus Kroppzeug.
"Date" dagegen nur "tt.mm.jjjj"

Also etwas robuster als Vorschlag:
' F:\schnipsel\parsefolders.vbs  
Dim objFS, f1, f2

set objFS = Wscript.CreateObject("Scripting.FileSystemObject")  
set f1 = objFS.GetFolder("D:\temp")  
set f2 = objFS.GetFolder("f:\schnipsel")  

targetType = "vbs"  
if (parseFolder(f1) or parseFolder(f2) ) then
	wscript.Echo "Found"  
else
	wscript.Echo "Not Found"  
end if

Function  parseFolder(fldr)
	parsefolder = false
	For each file in fldr.Files
		If LCase(objFS.GetExtensionName(file.Name)) = LCase(targetType) Then
			if DateDiff("d",file.DateCreated, Date) = 0 then  
				parseFolder = true
				WScript.echo fldr.name , ":" ,file.name , file.DateCreated  
				'send a message  
				Exit Function
			End if
			
		End if	
	Next
	
	
End Function

proof of concept
>f:\schnipsel\parsefolders.vbs
schnipsel : parsefolders.vbs 12.10.2011 22:20:05
Found

Grüße
Biber
Mitglied: lionne
lionne 13.10.2011 um 12:13:11 Uhr
Goto Top
Hallo zusammen,

danke für die Zahlreiche Antwort. So habe ich jetzt das Programm gebastelt und es funktioniert.

Mein Ziel ist jetzt nur eine for-Schleife zu benutzen und die Ordner als Parameter zu übergeben.

Kann Jemand helfen?

Danke und Gruß
Lionne


Sub parseFolder()

    Dim f1, f2, targetType, fso, filePdf, currentDate

    Set fso     = CreateObject("Scripting.FileSystemObject")  
    f1       = "D:\test1"   
	f2      = "E:\Customer NOV\PdfFile"  
    
	targetType = "pdf"  

	
		currentDate = Date()
		
		'Ordner1  
		For Each filePdf In fso.GetFolder(f1).Files 		 
			If LCase(fso.GetExtensionName(filePdf.Name)) = LCase(targetType) Then
			
				If ( filePdf.DateCreated < currentDate ) Then					
					WScript.echo filePdf.Name & " " & filePdf.DateCreated  
					listeErstellen 'subaufruf  
				End If		
			End If
		Next
	   
		
		'Ordner1  
		For Each filePdf In fso.GetFolder(f2).Files 
		 
			If LCase(fso.GetExtensionName(filePdf.Name)) = LCase(targetType) Then 'Test Datei-Typ  
				
				If ( filePdf.DateCreated < currentDate ) Then					
					WScript.echo filePdf.Name & " " & filePdf.DateCreated  
					listeErstellen 'subaufruf  
				End If
			End If
		Next
	
end Sub
Mitglied: colinardo
colinardo 13.10.2011 um 12:25:11 Uhr
Goto Top
Das hatte ich doch schon ganz zu Anfang mit der parseFolder "Function" demonstriert...
denke dein Problem sollte hiermit einen Abschluss finden:
    Dim f1, f2, targetType, fso, filePdf, currentDate

    Set fso     = CreateObject("Scripting.FileSystemObject")  
    f1       = "D:\test1"   
	f2      = "E:\Customer NOV\PdfFile"  
    
	targetType = "pdf"  
	currentDate = Date()
	sucheDateiInOrdner(f1)
	sucheDateiInOrdner(f2)
	


Function sucheDateiInOrdner(ordner)
	For Each filePdf In fso.GetFolder(ordner).Files 		 
			If LCase(fso.GetExtensionName(filePdf.Name)) = LCase(targetType) Then
			
				If ( filePdf.DateCreated < currentDate ) Then					
					WScript.echo filePdf.Name & " " & filePdf.DateCreated  
					listeErstellen 'subaufruf  
				End If		
			End If
		Next
End Function
Mitglied: lionne
lionne 13.10.2011 um 13:15:04 Uhr
Goto Top
Danke es funktioniert sehr gut.

Aber sobald, ich die Funktion in ein Programm einfüge, wo es 5 andere Sub gibt, bekomme ich die Fehlermeldung: "object required 'fso'".

Woran kann es liegen?

Danke
Lionne
Mitglied: colinardo
colinardo 13.10.2011 um 13:26:05 Uhr
Goto Top
Der obere Teil bis einschl. sucheDateiInOrdner gehört nicht in ein Sub sondern direkt in die VBS-Datei. Die Meldung kommt deswegen weil set fso=... global deklariert werden muss sonst findet die Funktion das Objekt fso nicht. Du kannst das Objekt fso aber auch nur in der Funktion deklarieren wenn du es nur dort benötigst, dann kommt der Fehler nicht.
Ein wenig Grundlagen VBS Lektüre wäre angesagt ...
Mitglied: lionne
lionne 13.10.2011 um 13:46:20 Uhr
Goto Top
Zitat von @colinardo:

Ein wenig Grundlagen VBS Lektüre wäre angesagt ...

Hallo Softmeister,

du hast recht. Ich suche immer noch ein gutes Buch, mit kleine Aufgaben und viele Beispiele. Wenn du eins kennst, gibt mir bitte den Name.

Ich habe vorher viel mit SQL gemacht, und jetzt bekomme ich immer mehr Programmierung Aufgaben.

Danke nochmal für deine Zahlreiche Antwort

Gruß
Lionne
Mitglied: colinardo
colinardo 13.10.2011 um 13:54:16 Uhr
Goto Top
Auf die schnelle ist das eine gute Übersicht der Sprachelemente mit Beispielen : http://www.asphelper.de/aspkurs/A300102.asp
Und hier eine Referenz: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id ...
Mitglied: lionne
lionne 13.10.2011 um 15:32:35 Uhr
Goto Top
Hallo Softmeister,

Danke ich werde die Seite speichern.

noch eine Frage:
Wenn es im Ordner 16 Pdf Dateien gibt, die die Bedingung if ( (datevalue(left( filePdf.DateCreated , 10)) < currentDate) erfüllen(siehe Zeile 19), dann bekomme ich von Sub „listErstellen“(siehe Zeile 21) soviel Meldungen wie die Anzahl der pdf Dateien.

Wie kann ich Steuern, dass diese nur einmal gesendet wird?

Gruß
Lionne
Mitglied: colinardo
colinardo 13.10.2011 um 15:44:48 Uhr
Goto Top
Du musst schon wissen bei welchem PDF du eine Sub-Prozedur aufrufen willst. Wenn du bei der ersten gefundenen Datei reagieren willst und die anderen ignorierst kannst du die FOR-Schleife mit Exit For oder Exit Function hinter "listErstellen" verlassen.
Mitglied: lionne
lionne 13.10.2011 um 16:35:36 Uhr
Goto Top
Vielen Dank, es funktioniert.

Gruß
Lionne