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

Dateien eines Ordners auslesen und in Protokolldatei speichern

Frage Entwicklung Basic

Mitglied: Gurkenhobel

Gurkenhobel (Level 1) - Jetzt verbinden

30.07.2014, aktualisiert 21:49 Uhr, 1431 Aufrufe, 19 Kommentare

Hallo Gemeinschaft,
schon wiedereinmal stehe ich vor UNENDLICHEN SCHWIERIGKEITEN. Ich möchte von jeder der ca.1200 Dateien eines Ordners die zwölfte Zeile auslesen und den Text in eine Protokolldatei schreiben. Davor (oder danach) soll der jweilige Dateiname stehen. Ich habe zwei vorhandene Scripts zusammengefügt, bekomme aber in Zeile 7 immer eine Fehlermeldung (Typenkonflikt).

01.
Set oFSO = createobject("Scripting.FileSystemObject") 
02.
Sub Listordner(ordner) 
03.
Set ordner = oFSO.getfolder(ordner) 
04.
 
05.
For Each file In ordner.files 
06.
 
07.
Set oFile = oFSO.OpenTextFile(ordner.files, 1) 
08.
 for i = 1 to 12 
09.
 strLine = oFile.Readline ' 12. Zeile auslesen 
10.
next 
11.
Stelle=Instr(strLine,"</h1>")-73 
12.
Ortsname = mid(strLine, 73,Stelle) & " " 
13.
oFile.Close 
14.
 
15.
 liste = liste & file.path & Ortsname & vbCr 
16.
 Next 
17.
For Each unterordner In ordner.subfolders 
18.
 liste = liste & unterordner.path & vbCr 
19.
 Listordner unterordner 
20.
 Next 
21.
End Sub 
22.
 
23.
Ordner ="." ' aktueller Ordner 
24.
Listordner ordner 
25.
Set logbuch = fs.opentextfile("inhalt.txt", 8, true,0) 
26.
Logbuch.writeline liste 
27.
Logbuch.close 
28.
 
Ich weiß nimmer weiter und würde mich über Hilfe sehr freuen.
Abendliche Grüße
Mitglied: An-dir
LÖSUNG 30.07.2014, aktualisiert 01.08.2014
Hallo Gurkenhobel

ich hab es mir so weit wie möglich abgewöhnt die alten Skripte zu verwenden und nutze lieber Powershell.

$output = ""
$Files = dir "c:\Dein Ordner"
Foreach ($File in $Files) {
$output += "`n`n`t
$($File.Fullname)
`n"
$output += (gc ($File.Fullname))[11]
}
$output | Out-File inhalt.txt

Aber wenn ich das richtig sehe, willst du HTML files einer Datenbank parsen. Soetwas ähnliches hab ich auch schon mal mit Powershell realisiert und da gibt es sehr viele gute Lösungen.

Gruß
Andi
Bitte warten ..
Mitglied: bastla
30.07.2014, aktualisiert um 22:53 Uhr
Hallo Gurkenhobel!

Ändere Zeile 7 auf
Set oFile = oFSO.OpenTextFile(file.Path)
oder kürzer
Set oFile = oFSO.OpenTextFile(file)
Grüße
bastla
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 12:01 Uhr
Danke Andi,
aber mit der Powershell habe ich nichts am Hut - kenne mich da rein gar nicht aus. In WSH (VBS) kenne ich wenigstens ein paar Grundzüge
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 12:20 Uhr
@bastla
Nach Änderung der Zeile 7 bekomme ich in Zeile 11 den Fehler: "Eingabe hinter Dateiende". Nun habe ich in einer Schleife elf Zeilen übersprungen, bekomme aber immer noch den gleichen Fehler

Zeilen 7 bis 14
01.
Set oFile = oFSO.OpenTextFile(file.Path) 
02.
' Set oFile = oFSO.OpenTextFile(file) 
03.
 
04.
for i=1 to 11 
05.
 oFile.Skipline ' Fehler: Eingabe hinter Dateiende 
06.
next 
07.
 
08.
strLine = oFile.Readline ' 12. Zeile auslesen 
09.
...
Was kann man tun ?
Bitte warten ..
Mitglied: bastla
31.07.2014 um 12:48 Uhr
Hallo Gurkenhobel!

Auf das Dateiende kannst Du mit
If oFile.AtEndOfStream Then
testen und entsprechend reagieren ...

Grüße
bastla
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 15:24 Uhr
Hallo bastla
WO soll ich denn die IF-Abfrage einbauen ? JEDE der Dateien im Ordner hat ja 25 Zeilen. Außerdem klappt es bei einer Abrage nach einzelnen Dateien ja auch:
01.
Set oFSO = CreateObject("Scripting.FileSystemObject") 
02.
Eingabe=Inputbox("Ihre Eingabe:") 
03.
Set oFile = oFSO.OpenTextFile(Eingabe, 1) 
04.
for i=1 to 11 
05.
 oFile.Skipline ' 11 Zeilen überspringen 
06.
next 
07.
strLine = oFile.Readline ' 12. Zeile 
08.
Stelle = Instr(strLine,"</h1>")-73 
09.
Wert = Eingabe & " " & mid(strLine, 73, Stelle) 
10.
Set Protokoll = oFSO.opentextfile("Protokoll.txt", 8, true, 0) ' Daten anhängen ... 
11.
 Protokoll.writeline Wert 
12.
 Protokoll.close 
13.
oFile.Close
Grüße G:H
Bitte warten ..
Mitglied: bastla
31.07.2014 um 15:33 Uhr
Hallo Gurkenhobel!

Einbauen müsstest Du die Abfrage vor jedem Lesezugriff (das wären die Zeilen 5 und 7); warum der Fehler auftritt, kann ich mir allerdings auch nicht erklären ...

Grüße
bastla
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 16:31 Uhr
Hallo bastla,
herumexperimentiert und ausprobiert, aber trotz
01.
Set oFile = oFSO.OpenTextFile(file.Path) 
02.
' Set oFile = oFSO.OpenTextFile(file) 
03.
If oFile.AtEndOfStream Then ' -------------- 
04.
 oFile.Close 
05.
 Set oFile = Nothing 
06.
 Exit Sub 
07.
End If
Kommt der Fehler immer noch...
Ich weiß nicht mehr weiter Ѿ
Grüße
Bitte warten ..
Mitglied: An-dir
31.07.2014, aktualisiert um 16:37 Uhr
Dann versuch dich doch mal an powershell. Du kannst den code einfach in eine Powershell rein kopieren und schon hast du das Ergebnis auf deinem Desktop.

01.
$InputFolder = "C:\testfileline12" # Pfad zu dem Ordner mit den einzulesenden Dateien 
02.
$OutputFile = "$env:userprofile\desktop\inhalt.txt" # Pfad zur Ausgabedatei - Momentan wäre es der Desktop 
03.
 
04.
$output = "" # Temporäre Variable 
05.
$Files = dir $InputFolder # Dateien im Ordner ermitteln 
06.
Foreach ($File in $Files) { 
07.
$output += "`r`n`r`n`t==== $($File.Fullname) ====`r`n" # trennzeilen mit vollständigem Namen als Überschrift (Alternativ "Fullname" durch "Name" ersetzen) 
08.
$output += (gc ($File.Fullname))[11] # Inhalte der Dateien 
09.
10.
$output | Out-File $OutputFile

Gruß
Andi
Bitte warten ..
Mitglied: bastla
31.07.2014 um 16:42 Uhr
Hallo Gurkenhobel!

Wie gesagt - warum es überhaupt zu dem Fehler kommt, weiß ich auch nicht; platzieren müsstest Du die Abfrage aber natürlich innerhalb der Schleife und damit vor jedem einzelnen Lesezugriff ...

Grüße
bastla
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 17:15 Uhr
@An-dir
Danke,
habe die Powershell ISE (x86) aufgerufen, das Script angepasst und abgespeichert.
Ausgeführt wurde es nicht - da die Datei "I:\Statistik\Deutschland\...\auslesen.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen erhalten Sie mit "get-help about_signing". Beim Aufurf von "get-help about_signing" kommt ein urig langer Text zur Signierung. Was kann ich weiter tun ?
Grüße
Bitte warten ..
Mitglied: An-dir
31.07.2014 um 17:31 Uhr
Du kannst die Befehle auch einfach rein kopieren. Mehrzeile Befehle gehen auch ohne Probleme. Am Ende musst du nur noch einmal die Eingabe taste drücken.

Wenn du die PS1 Datei ausführen willst, dann kannst du in eine Powershell die mit Adminrechten gestartet wird den Befehl "Set-ExecutionPolicy Unrestricted" einfügen und dann alle ps1 skripte ohne prüfung ausführen (http://technet.microsoft.com/de-de/library/ee176961.aspx)
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 18:35 Uhr
Danke, soweit lief es ganz gut. Habe die Zeile 7 geändert auf
01.
$output += "`r`n$($File.Name): `t"
und bekomme dafür folgendes Resultat:
01.
... 
02.
117.php: 	<img src="../css/LEO-BW-logo.png" width="70"><h1>Geschlechterverteilung: Haslach </h1> 
03.
118.php: 	<img src="../css/LEO-BW-logo.png" width="70"><h1>Geschlechterverteilung: Herrenberg </h1> 
04.
119.php: 	<img src="../css/LEO-BW-logo.png" width="70"><h1>Geschlechterverteilung: Kayh </h1> 
05.
...
wie bekomme ich die unerwünschten Zeichen zwischen <img src..> und "Geschlechterverteilung: " bzw. das </h1> weg ?
Grüße
Bitte warten ..
Mitglied: An-dir
31.07.2014, aktualisiert um 19:05 Uhr
Freut mich dass du schon gut vorankommst

wenn du es einfach willst, dann könntest du split verwenden.

($Variable.split(":"))[1].split("<")[0]

Damit sollte das Ergebnis dann so aussehen:
117.php: Haslach
118.php: Herrenberg
119.php: Kayh

Falls du dann auftretende Leerzeichen am Anfang und am Ende entfernen möchtest, dann einfach ".trim()" anfügen.
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 19:25 Uhr
...
und wo soll das
01.
($Variable.split(":"))[1].split("<")[0]
hinein, hab's ergebnislos in drei Zeilen probiert...
Bitte warten ..
Mitglied: An-dir
31.07.2014, aktualisiert um 19:39 Uhr
Sorry

Du hast ja meinen Code einwenig umgebaut und jetzt hab ich zu viel gefordert.

in der Zeile einfach so: $output += ((gc ($File.Fullname))[11].split(":"))[1].split("<")[0]
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 20:33 Uhr
Hallo An-dir,
ja das Ergebnis sieht ganz passabel aus und ich glaube, wir können das so lassen.
Danke für den Minikurs in Power-Shell, und noch einen schönen Abend
GѾH
Bitte warten ..
Mitglied: An-dir
31.07.2014 um 21:20 Uhr
Freut mich dass ich dir helfen konnte und vielleicht die PowerShell etwas näher bringen konnte.
Die Frage könnte dann ja als gelöst markiert werden.
Bitte warten ..
Mitglied: Gurkenhobel
31.07.2014 um 21:36 Uhr
@bastla
habe immer das letzte Wort. Hier noch eine modifiziertes Script mit Unterprogramm - es funktioniert auch.
01.
Dim objFso, strFolder, Logbuch 
02.
 
03.
' ------------ Beginn Hauptprogramm 
04.
 
05.
Set objFso = CreateObject("Scripting.FileSystemObject") 
06.
strFolder = objFso.GetParentFolderName(WScript.ScriptFullName) ' nur der Ordnername 
07.
 
08.
If objFso.FolderExists(strFolder) Then 
09.
 Call GetPHPFiles(objFso.GetFolder(strFolder)) 
10.
End If 
11.
 
12.
Set objFso = Nothing 
13.
 
14.
' ----------- Ende Hauptprogramm 
15.
 
16.
Sub GetPHPFiles(ByRef objFolder) 
17.
Dim objFile, objSubFolder 
18.
 For Each objFile In objFolder.Files 
19.
  If LCase(objFso.GetExtensionName(objFile.Name)) = "php" Then 
20.
   Call PHPRead(objFile) 
21.
  End If 
22.
 Next 
23.
 For Each objSubFolder In objFolder.SubFolders 
24.
  Call GetPHPFiles(objSubFolder) 
25.
 Next 
26.
End Sub 
27.
 
28.
Sub PHPRead(ByRef objFile) 
29.
 Dim arrText, strText, strTextLine, objPHPFile, intPosition1, intPosition2 
30.
 Set objPHPFile = objFso.OpenTextFile(objFile.Path) 
31.
 arrText = Split(objPHPFile.ReadAll, vbCrLf) 
32.
 objPHPFile.Close 
33.
 For Each strTextLine In arrText 
34.
  If strTextLine <> "" Then 
35.
   strText = Trim(strTextLine) 
36.
   intPosition1=Instr(1,strText,"</title>") '</title> kommt eher als </H1> vor 
37.
   intPosition2 = InStr(1, strText, "Geschlechterverteilung: ", vbTextCompare) + 24 
38.
    Ortsname = objFile.name & vbTab & Mid(strText, intPosition2, intPosition1-intPosition2) 
39.
   End If 
40.
  End If 
41.
 Next 
42.
 
43.
' Jetzt in Datei schreiben... 
44.
Set logbuch = objFSO.opentextfile("Dateiliste.txt", 8, true,0) ' Neue Daten werden angehängt ... 
45.
 Logbuch.writeline Ortsname 
46.
 Logbuch.close 
47.
End Sub
Schönen Abend allen und Schluss
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Dateien im Ordner auslesen und umbennen (10)

Frage von jocheng zum Thema Batch & Shell ...

Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...