Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateisuche in Ordner mit 50.000 Dateien zu langsam

Frage Entwicklung VB for Applications

Mitglied: woswasih

woswasih (Level 1) - Jetzt verbinden

26.05.2014, aktualisiert 11:39 Uhr, 1287 Aufrufe, 9 Kommentare

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:
01.
  
02.
Const olByValue = 1 
03.
Const olMailItem = 0 
04.
  
05.
Dim oOApp 
06.
Dim oOMail 
07.
Dim oFolder 
08.
Dim oFile 
09.
Dim ixb 
10.
Dim bericht(2) 
11.
  
12.
Set args = Wscript.Arguments 
13.
 
14.
Set oFSO = CreateObject("Scripting.FileSystemObject")   
15.
set oFolder = oFSO.GetFolder ("C:\txt") 
16.
Set oOApp = CreateObject("Outlook.Application") 
17.
Set oOMail = oOApp.CreateItem(olMailItem) 
18.
  
19.
ixb = 0 
20.
 
21.
 With oOMail 
22.
     
23.
	.GetInspector.Display 
24.
     olOldBody = .htmlBody 
25.
	 
26.
	.To = WScript.Arguments.Item(0) 
27.
    .Subject = "Betreff" 
28.
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody 
29.
	 
30.
	For Each oFile In oFolder.Files 
31.
		If left(oFile.Name,12) = WScript.Arguments.Item(1) Then 
32.
			If right(oFile.Name,3) = "pdf" Then 
33.
				If ixb < 2 Then 
34.
					bericht(ixb) = oFile.Name 
35.
					.Attachments.Add ofolder & "\" & bericht(ixb), olByValue, 1 
36.
					ixb = ixb + 1 
37.
				End If				 
38.
			End If 
39.
		End If 
40.
	Next 
41.
	 
42.
	.Display 
43.
End With


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







Mitglied: Xaero1982
26.05.2014 um 11:51 Uhr
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ß
Bitte warten ..
Mitglied: woswasih
26.05.2014 um 11:59 Uhr
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
Bitte warten ..
Mitglied: colinardo
LÖSUNG 26.05.2014, aktualisiert um 13:48 Uhr
Servus Chris,
könntest du über einen Umweg so machen:
01.
Set objShell = CreateObject("Wscript.Shell") 
02.
Set oExec = objShell.Exec("cmd /c dir /B /S /A-D ""c:\txt\" & WScript.Arguments.Item(1) & "*.pdf"" 2>nul") 
03.
Do While oExec.Status = 0 
04.
     WScript.Sleep 100 
05.
Loop 
06.
files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1) 
07.
 
08.
For i = 0 To UBound(files) 
09.
	If Trim(files(i)) <> "" Then 
10.
		MsgBox files(i) 
11.
                'mach was mit dem file ... 
12.
	End If 
13.
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
Bitte warten ..
Mitglied: Snowman25
26.05.2014, aktualisiert um 12:05 Uhr
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
Bitte warten ..
Mitglied: Xaero1982
26.05.2014 um 12:05 Uhr
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?
Bitte warten ..
Mitglied: woswasih
26.05.2014, aktualisiert um 12:48 Uhr
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!?

01.
Const olByValue = 1 
02.
Const olMailItem = 0 
03.
  
04.
Dim oOApp 
05.
Dim oOMail 
06.
Dim oFolder 
07.
Dim oFile 
08.
  
09.
Set args = Wscript.Arguments 
10.
 
11.
Set oFSO = CreateObject("Scripting.FileSystemObject")   
12.
set oFolder = oFSO.GetFolder ("C:\txt") 
13.
Set oOApp = CreateObject("Outlook.Application") 
14.
Set oOMail = oOApp.CreateItem(olMailItem) 
15.
Set objShell = CreateObject("Wscript.Shell")  
16.
Set oExec = objShell.Exec("cmd /c dir /B /S /A-D ""c:\txt\" & "WTG024912014" & "*.pdf"" 2>nul")  
17.
	 
18.
 With oOMail 
19.
     
20.
	.GetInspector.Display 
21.
     olOldBody = .htmlBody 
22.
	 
23.
	.To = "text@test.at" 
24.
    .Subject = "Betreff" 
25.
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody 
26.
 
27.
	Do While oExec.Status = 0  
28.
		WScript.Sleep 100  
29.
	Loop  
30.
 
31.
	files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1)  
32.
 
33.
	For i = 0 To UBound(files)  
34.
		If Trim(files(i)) <> "" Then  
35.
			.Attachments.Add ofolder & "\" & files(i), olByValue, 1 
36.
		End If  
37.
	Next 
38.
	 
39.
	.Display 
40.
End With
Bitte warten ..
Mitglied: colinardo
26.05.2014, aktualisiert um 12:57 Uhr
setze die While-Schleife und den Split-Part in Zeile 17 ein, und das oFolder ist doppelt für den Pfad...

01.
Const olByValue = 1 
02.
Const olMailItem = 0 
03.
  
04.
Dim oOApp 
05.
Dim oOMail 
06.
Dim oFolder 
07.
Dim oFile 
08.
  
09.
Set args = Wscript.Arguments 
10.
 
11.
Set oFSO = CreateObject("Scripting.FileSystemObject")   
12.
oFolder = "C:\txt" 
13.
Set oOApp = CreateObject("Outlook.Application") 
14.
Set oOMail = oOApp.CreateItem(olMailItem) 
15.
Set objShell = CreateObject("Wscript.Shell")  
16.
Set oExec = objShell.Exec("cmd /c dir /B /A-D """ & oFolder & "\WTG024912014" & "*.pdf"" 2>nul")  
17.
Do While oExec.Status = 0  
18.
   WScript.Sleep 100  
19.
Loop  
20.
files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1)  
21.
 
22.
With oOMail 
23.
     
24.
	.GetInspector.Display 
25.
        olOldBody = .htmlBody 
26.
	.To = "text@test.at" 
27.
        .Subject = "Betreff" 
28.
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody 
29.
 
30.
	For i = 0 To UBound(files)  
31.
		If Trim(files(i)) <> "" Then  
32.
			.Attachments.Add oFolder & "\" & files(i), olByValue, 1 
33.
		End If  
34.
	Next 
35.
	 
36.
	.Display 
37.
End With
Bitte warten ..
Mitglied: woswasih
26.05.2014, aktualisiert um 13:05 Uhr
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)

01.
Const olByValue = 1 
02.
Const olMailItem = 0 
03.
  
04.
Dim oOApp 
05.
Dim oOMail 
06.
Dim oFolder 
07.
Dim oFile 
08.
  
09.
Set args = Wscript.Arguments 
10.
 
11.
Set oFSO = CreateObject("Scripting.FileSystemObject")   
12.
oFolder = "C:\txt" 
13.
Set oOApp = CreateObject("Outlook.Application") 
14.
Set oOMail = oOApp.CreateItem(olMailItem) 
15.
Set objShell = CreateObject("Wscript.Shell")  
16.
Set oExec = objShell.Exec("cmd /c dir /B /S /A-D """ & oFolder & "\WTG024912014" & "*.pdf"" 2>nul")  
17.
Do While oExec.Status = 0  
18.
		WScript.Sleep 100  
19.
Loop  
20.
files = Split(oExec.StdOut.ReadAll(),vbNewLine,-1,1)  
21.
 
22.
 With oOMail 
23.
 	.GetInspector.Display 
24.
     olOldBody = .htmlBody 
25.
	.To = "text@test.at" 
26.
    .Subject = "Betreff" 
27.
	.htmlBody = "<font size='3,9' face='Calibri (Texkörper)' color='#151B54'>In der Anlage finden Sie die Berichte" & olOldBody 
28.
	 
29.
	For i = 0 To UBound(files)  
30.
		If Trim(files(i)) <> "" Then  
31.
			.Attachments.Add oFolder & "\" & files(i), olByValue, 1 
32.
		End If  
33.
	Next 
34.
	 
35.
	.Display 
36.
End With
lg
Bitte warten ..
Mitglied: woswasih
26.05.2014, aktualisiert um 13:29 Uhr
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!
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Windows Server
Server sehr langsam bei vielen kleinen Dateien (5)

Frage von MichiBLNN zum Thema Windows Server ...

Batch & Shell
gelöst Per Batch Dateien in einen Ordner - ext. Festplatte übertragen (2)

Frage von tocksick zum Thema Batch & Shell ...

Windows Server
gelöst Freigegebener Ordner "Eigene Dateien" (8)

Frage von JensDND zum Thema Windows Server ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...