Dateisuche in Ordner mit 50.000 Dateien zu langsam
Zuerstmal ein Hallo an alle und schöne grüße aus Oberösterreich! 
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:
Hoffe Ihr habt vielleicht einen Tipp für mich!
Lg Chris
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 239169
Url: https://administrator.de/forum/dateisuche-in-ordner-mit-50-000-dateien-zu-langsam-239169.html
Ausgedruckt am: 19.04.2025 um 01:04 Uhr
9 Kommentare
Neuester Kommentar
Servus Chris,
könntest du über einen Umweg so machen:
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
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
Grüße Uwe
Hallo @woswasih,
Wird aber nur 3 mal ausgeführt?
Das braucht alles Zeit.
Gibt es vielleicht eine
Insgesamt geht es wohl schneller, wenn du dir ein Directory-Listing nimmst. Als batch-befehl in etwa:
Dann hast du eine Zeilenumbruch-getrennte Liste aller Dateien, die du brauchst. Und dann bearbeitest du nur die ersten 3 davon.
Gruß,
@Snowman25
For Each oFile In oFolder.Files
If left(oFile.Name,12) = WScript.Arguments.Item(1) Then
String-Operationen über 50k FilesIf left(oFile.Name,12) = WScript.Arguments.Item(1) Then
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.bericht(ixb) = oFile.Name
.Attachments.Add ofolder & "\" & bericht(ixb), olByValue, 1
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"}}
Gruß,
@Snowman25
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