woswasih
Goto Top

Dateisuche in Ordner mit 50.000 Dateien zu langsam

Zuerstmal ein Hallo an alle und schöne grüße aus Oberösterreich! face-wink

Ich habe folgendes Problem, ich erstelle per Script ein E-Mail und hänge dem E-Mail 1-3 Dateien von einem Netzwerkorder an, in diesem Ordner befinden sich (dzt. ca. 50.000 Dateien).
An das Script werden 2 Variablen übergeben, (1) die Empfänger E-Mail Adresse, und (2) die ersten 12 Zeichen des Dateinamens, die restlichen Zeichen des Dateinamnens (Zeitstempel) sind mir zu dem Zeitpunkt leider nicht bekannt, was jedoch grundsätzlich kein Problem sein sollte da ja alle 1-3 Dateien mit den gleichen 12 Zeichen beginnen und ich alle 1-3 Dateien anhängen möchte.

Im Test mit in etwa 20 Dateien im Ordner funktioniert das recht flott... Jeodch nun im Echtbetrieb, ist es einfach nicht möglich das so zu handeln.
Leider habe ich bisher nichts gefunden um das sinnvoll zu erledigen.

Hier das Script:
 
Const olByValue = 1
Const olMailItem = 0
 
Dim oOApp
Dim oOMail
Dim oFolder
Dim oFile
Dim ixb
Dim bericht(2)
 
Set args = Wscript.Arguments

Set oFSO = CreateObject("Scripting.FileSystemObject")    
set oFolder = oFSO.GetFolder ("C:\txt")  
Set oOApp = CreateObject("Outlook.Application")  
Set oOMail = oOApp.CreateItem(olMailItem)
 
ixb = 0

 With oOMail
    
	.GetInspector.Display
     olOldBody = .htmlBody
	
	.To = WScript.Arguments.Item(0)
    .Subject = "Betreff"  
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody  
	
	For Each oFile In oFolder.Files
		If left(oFile.Name,12) = WScript.Arguments.Item(1) Then
			If right(oFile.Name,3) = "pdf" Then  
				If ixb < 2 Then
					bericht(ixb) = oFile.Name
					.Attachments.Add ofolder & "\" & bericht(ixb), olByValue, 1  
					ixb = ixb + 1
				End If				
			End If
		End If
	Next
	
	.Display
End With


Hoffe Ihr habt vielleicht einen Tipp für mich!
Lg Chris

Content-Key: 239169

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

Ausgedruckt am: 28.03.2024 um 11:03 Uhr

Mitglied: Xaero1982
Xaero1982 26.05.2014 um 11:51:47 Uhr
Goto Top
Moin,

ja zwei Tipps:

Dateien splitten - sorry, aber 50.000 Dateien in einem Ordner sind zu viel für Windows
oder
evtl. kommt Linux besser damit klar.

Gruß
Mitglied: woswasih
woswasih 26.05.2014 um 11:59:44 Uhr
Goto Top
Grüß Dich,
danke, aber leider komme ich mit dem nicht wirklich weiter da ich die Dateien nicht auf mehrere Ordner aufteilen kann... Das System darüber kann damit nicht umgehen...

Das einzige was mit Aufällt, ein kopieren zB: mit "Erste12Zeichen*.pdf" geht eigentlich sehr schnell.
Also evtl. in neuen Ordner kopieren, von dort aus in Mail und anschlißend wieder löschen...

Aber ich vieleicht hat ja noch wer eine bessere Lösung?

LG
Mitglied: colinardo
Lösung colinardo 26.05.2014 aktualisiert um 13:48:45 Uhr
Goto Top
Servus Chris,
könntest du über einen Umweg so machen:
Set objShell = CreateObject("Wscript.Shell")  
Set oExec = objShell.Exec("cmd /c dir /B /S /A-D ""c:\txt\" & WScript.Arguments.Item(1) & "*.pdf"" 2>nul")  
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1)

For i = 0 To UBound(files)
	If Trim(files(i)) <> "" Then  
		MsgBox files(i)
                'mach was mit dem file ...  
	End If
Next
Alternativ könnte man sich ein COM-Objekt (dll) in Visual-Studio bauen das die .NET-Funktionen dazu nutzt und dann ins Script mit CreateObject einbinden, ansonsten lässt sich das ganze auch problemlos und schnell mit Powershell machen.

Grüße Uwe
Mitglied: Snowman25
Snowman25 26.05.2014 aktualisiert um 12:05:14 Uhr
Goto Top
Hallo @woswasih,
For Each oFile In oFolder.Files
If left(oFile.Name,12) = WScript.Arguments.Item(1) Then
String-Operationen über 50k Files
If right(oFile.Name,3) = "pdf" Then
String-Operationen über eine Sub-Menge der 50k Files
If ixb < 2 Then
bericht(ixb) = oFile.Name
.Attachments.Add ofolder & "\" & bericht(ixb), olByValue, 1
Datei-Operation, welche das Einlesen und Verarbeiten der Datei benötigt.
Wird aber nur 3 mal ausgeführt?

Das braucht alles Zeit.
Gibt es vielleicht eine oFile.Filetype-Variable, die du Vergleichen kannst?

Insgesamt geht es wohl schneller, wenn du dir ein Directory-Listing nimmst. Als batch-befehl in etwa:
{{"dir /B /A-D" & Wscript.Arguments.Item(1) & "*.pdf"}}
Dann hast du eine Zeilenumbruch-getrennte Liste aller Dateien, die du brauchst. Und dann bearbeitest du nur die ersten 3 davon.

Gruß,
@Snowman25
Mitglied: Xaero1982
Xaero1982 26.05.2014 um 12:05:04 Uhr
Goto Top
Verstehe ich nicht ganz. Also das rauskopieren einer Datei aus dem Ordner mit den 50.000 Dateien in einen anderen Ordner geht schnell, aber das Versenden widerum nicht?
Mitglied: woswasih
woswasih 26.05.2014 aktualisiert um 12:48:40 Uhr
Goto Top
Hi Uwe, ich versuche mal deinen Lösungsansatz, nur scheint es als sei ich mit meinen Anfängerkenntnissen zu doof, das korrekt bei mir einzubauen!?

Const olByValue = 1
Const olMailItem = 0
 
Dim oOApp
Dim oOMail
Dim oFolder
Dim oFile
 
Set args = Wscript.Arguments

Set oFSO = CreateObject("Scripting.FileSystemObject")    
set oFolder = oFSO.GetFolder ("C:\txt")  
Set oOApp = CreateObject("Outlook.Application")  
Set oOMail = oOApp.CreateItem(olMailItem)
Set objShell = CreateObject("Wscript.Shell")   
Set oExec = objShell.Exec("cmd /c dir /B /S /A-D ""c:\txt\" & "WTG024912014" & "*.pdf"" 2>nul")   
	
 With oOMail
    
	.GetInspector.Display
     olOldBody = .htmlBody
	
	.To = "text@test.at"  
    .Subject = "Betreff"  
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody  

	Do While oExec.Status = 0 
		WScript.Sleep 100 
	Loop 

	files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1) 

	For i = 0 To UBound(files) 
		If Trim(files(i)) <> "" Then   
			.Attachments.Add ofolder & "\" & files(i), olByValue, 1  
		End If 
	Next
	
	.Display
End With
Mitglied: colinardo
colinardo 26.05.2014 aktualisiert um 12:57:11 Uhr
Goto Top
setze die While-Schleife und den Split-Part in Zeile 17 ein, und das oFolder ist doppelt für den Pfad...

Const olByValue = 1
Const olMailItem = 0
 
Dim oOApp
Dim oOMail
Dim oFolder
Dim oFile
 
Set args = Wscript.Arguments

Set oFSO = CreateObject("Scripting.FileSystemObject")    
oFolder = "C:\txt"  
Set oOApp = CreateObject("Outlook.Application")  
Set oOMail = oOApp.CreateItem(olMailItem)
Set objShell = CreateObject("Wscript.Shell")   
Set oExec = objShell.Exec("cmd /c dir /B /A-D """ & oFolder & "\WTG024912014" & "*.pdf"" 2>nul")   
Do While oExec.Status = 0 
   WScript.Sleep 100 
Loop 
files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1) 

With oOMail
    
	.GetInspector.Display
        olOldBody = .htmlBody
	.To = "text@test.at"  
        .Subject = "Betreff"  
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody  

	For i = 0 To UBound(files) 
		If Trim(files(i)) <> "" Then   
			.Attachments.Add oFolder & "\" & files(i), olByValue, 1  
		End If 
	Next
	
	.Display
End With
Mitglied: woswasih
woswasih 26.05.2014 aktualisiert um 13:05:57 Uhr
Goto Top
Hallo, Irgendwo hats mich noch...
Bekomme dan Fehler das Der Datei- pder ORdnermane ungültig ist!? (c:\txt\new.vbs, was das script eigentlich selbst wäre)

Const olByValue = 1
Const olMailItem = 0
 
Dim oOApp
Dim oOMail
Dim oFolder
Dim oFile
 
Set args = Wscript.Arguments

Set oFSO = CreateObject("Scripting.FileSystemObject")    
oFolder = "C:\txt"  
Set oOApp = CreateObject("Outlook.Application")  
Set oOMail = oOApp.CreateItem(olMailItem)
Set objShell = CreateObject("Wscript.Shell")   
Set oExec = objShell.Exec("cmd /c dir /B /S /A-D """ & oFolder & "\WTG024912014" & "*.pdf"" 2>nul")   
Do While oExec.Status = 0 
		WScript.Sleep 100 
Loop 
files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1) 

 With oOMail
 	.GetInspector.Display
     olOldBody = .htmlBody
	.To = "text@test.at"  
    .Subject = "Betreff"  
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody  
	
	For i = 0 To UBound(files) 
		If Trim(files(i)) <> "" Then   
			.Attachments.Add oFolder & "\" & files(i), olByValue, 1  
		End If 
	Next
	
	.Display
End With
lg
Mitglied: woswasih
woswasih 26.05.2014 aktualisiert um 13:29:51 Uhr
Goto Top
Herzlichen Dank!
Die Lösung funktioniert Perfekt!!

Jetzt sinds nur mehr 2 Kleingkeiten:
1) Schriftgröße 11 zu definieren schaff ich nicht...
2) das Outlook nicht jammert wenn ich ihm was übergebe...

Danke nochmals!