gurkenhobel
Goto Top

Alle Dateien eines Ordners zusammenkopieren - nach Auswahlkriterien

Hallo Gemeinde,

mir liegt ein VB-Script vor, daß ALLE Textdateien des aktuellen Ordners in eine einzige Datei kopiert (JOIN, MERGE, COMBINE, CONCATENATE). Ich nöchte aber nur bestimmte Dateitypen verarbeiten. Leider kommt beim Aufruf ein Fehler. Wie kann man das beseitigen?

Dim fso, folder, files, NewsFile,sFolder, objTextFile
Const ForReading = 1

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objOutputFile = fso.CreateTextFile("Merged.txt")  
currentPath = ".\"  
sFolder= currentPath

Set files = fso.GetFolder(sFolder).Files
MSgBox files.Count
For each folderIdx In files    
 if lcase(objFSO.getExtensionName(files.path))="wb2" then  ' Fehler 1A8 / 1B6  
  Set objTextFile = fso.OpenTextFile(folderIdx.path, ForReading) '.name statt .path  
  strText = objTextFile.ReadAll
  objTextFile.Close
  objOutputFile.WriteLine strText
 End if
Next  
objOutputFile.Close
Egal ob ich in Zeile 12
...getExtensionName(file ODER files
verwende es kommt immer ein Fehler

Danke im voraus für die Hilfe

Micha

Content-Key: 192348

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

Printed on: April 25, 2024 at 13:04 o'clock

Member: bastla
bastla Oct 07, 2012 updated at 14:17:43 (UTC)
Goto Top
Hallo Gurkenhobel!

Etwas gestrafft (aber nicht getestet) etwa so:
Dim fso, file, files, sFolder, objOutputFile

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objOutputFile = fso.CreateTextFile("Merged.txt")  
sFolder = ".\"  

Set files = fso.GetFolder(sFolder).Files
For Each file In files    
    If LCase(fso.GetExtensionName(file.Name)) = "wb2" Then  
        objOutputFile.WriteLine fso.OpenTextFile(file.Path).ReadAll
     End if
Next  
objOutputFile.Close
Beim Zusammenkopieren von Code-Schnipseln immer darauf achten, dass Objekte gleich benannt sind (im konkreten Fall "objFSO" vs "fso") - das wäre Dir übrigens eher aufgefallen, wenn du "Option Explicit" verwendet hättest (ansonsten wären die Deklarationen per "Dim" hier auch entbehrlich) ...

Falls Du übrigens noch Wert auf die Ausgabe der Anzahl an "wb2"-Files legst, musst du diese per Zähler innerhalb der Schleife ermitteln ...

Grüße
bastla

P.S.: Als Batch wäre das übrigens genau eine Zeile:
type *.wb2>Merged.txt
Member: rubberman
rubberman Oct 07, 2012 updated at 14:11:04 (UTC)
Goto Top
Hallo Gurkenhobel,

files ist eine Aufzählung, die alle Dateien im spezifizierten Verzeichnis repräsentiert. Somit hat files natürlich keine Eigenschaft path.
Du iterierst aber über files und ordnest der Variablen folderIdx jeweils ein Dateiobjekt zu (auch wenn der von dir gewählte Name etwas irreführend ist).
Somit solltest du mal mit fso.getExtensionName(folderIdx.Path) testen (objFSO hast du nämlich auch nirgends definiert face-wink).
Gut gemeinter Rat:
Du solltest zumindest versuchen zu verstehen, was du so zusammen kopierst.

Grüße
rubberman

[Edit Hallo bastla face-wink /]
Member: Gurkenhobel
Gurkenhobel Oct 07, 2012 updated at 15:37:15 (UTC)
Goto Top
Hallo Ihre zwei beiden

und danke für die Aufklärung. Ich tue mir manchmal sehr schwer, wenn ich gefunde Scripte anpasse.

Den Batch mit
type *.wb2 > Merged.txt
hatte ich auch schon probiert. Aber irgendwie haben die wb2-Dateien kein abschließendes Zeilenende CR so daß dann alles in eine (schlecht auswertbare) Zeile kopiert wird.

mit
if lcase(fso.getExtensionName(folderIdx.Path))="wb2" Then
klappt es natürlich auch...

Einen schönen (Rest-)Sonntag wünscht Euch der Gurkenhobel
Member: bastla
bastla Oct 07, 2012 updated at 15:43:10 (UTC)
Goto Top
Hallo Gurkenhobel!
irgendwie haben die wb2-Dateien kein abschließendes Zeilenende CR so daß dann alles in eine (schlecht auswertbare) Zeile kopiert wird.
Vermutlich fehlt eher LF - anyhow, sollte etwa so gehen:
for %%i in (*.wb2) do (type "%%i" & echo\)>>Merged.txt
Grüße
bastla
Member: Gurkenhobel
Gurkenhobel Oct 07, 2012 at 17:12:52 (UTC)
Goto Top
Ja danke Bastla,

AUCH DAS funktioniert ganz toll.
Grüße

Gurkenhobel
Member: pieh-ejdsch
pieh-ejdsch Oct 07, 2012 updated at 20:22:17 (UTC)
Goto Top
moin,

ergänzend dazu (weil schon etwas Batch mit ist) noch das Anzeigen von .txt Dateien, welche kein Abschliesendes LF haben:
findstr /m /v $ *.txt
Um keine zusätzliche Leerzeile bei den Dateien mit abschliessendem LF zu erzeugen benutzt man Find:
(for %i in (*.txt) do @find /v "" <"%~i")>merged.txt
Wenn es etwas Performanter sein soll mit einer Pipe:
(for %i in (*.txt) do @type "%~i" |findstr .)>merged.txt
More statt type gibt gleich das fehlende LF dazu, sollte aber gepiped oder in ein Datei umgeleitet werden.

Eine Pipe zu more erzeugt eine Zusätzliche Zeile (wie Echo().

Gruß Phil