lionne
Goto Top

VBScript Fehlermeldung mit der Methode GetExtensionName

Hallo Zusammen,

Ich habe ein Skript mit dem ich in einer csv Datei bestimmte Werte(Datum ,Dateiname, usw...) auslese und in einer Array schreibe. Das funktioniert soweit gut.

Mein Problem ist in gleichen Ordner, wo die csv Dateien liegen, sind auch pdf Dateien vorhanden und ich möchte die gelesene Dateiname(aus der csv Datei) mit dem Name der pdf Datei vergleichen, aber leider bekomme ich immer folgende Fehlermeldung(siehe rote Zeile).

Kann jemand mir sagen was falsch ist? Ich habe schon in Internet gesucht und nicht gefunden.

Danke im Voraus
Lionne

Const forReading = 1
Dim fso, file, column
Dim textline 'TextZeile  
Dim inputDir, targetTypeCsv, targetTypePdf, Dateiname

Set fso=CreateObject("Scripting.FileSystemObject")  
inputDir = "C:\Temp\"  
targetTypeCsv = "csv"  
targetTypePdf = "pdf"  

For Each file In fso.GetFolder(inputDir).Files 'alle Dateien des inputDirs durchgehen  
	
	'1. CVS Dateien nach eineinder öffnen und 'Datum und Dateiname in einer Array auslesen  
	If LCase(fso.GetExtensionName(file.Name)) = LCase(targetTypeCsv) Then 'Test Datei-Typ  

		Set file = fso.OpenTextFile(file, forReading, False)
		while not file.AtEndOfStream
			textline=file.Readline()
			column=Split(textline,"|")	  
	
	'2. Alle pdf Dateien in Odner durchgehen und prüfen, ob eine die gleiche Dateiname wie die "gelesene Dateiname" hat  
	If LCase(fso.GetExtensionName(file.Name)) = LCase(targetTypePdf) Then ' ##red 'Fehlermeldung ab hier: "800A01B6 --> Object doesn't support this property or method: Name"  
		Dateiname = file.Name 
		MsgBox "Dateiname_CSV: " & Dateiname  
		if column(44) = Dateiname Then
			MsgBox "Pdf_Dateiname: " & Dateiname 'pdf Dateiname ausgeben  
		End if	
			
	End if
			
	
	wend		
file.Close 

	End If
	
Next

Content-Key: 162693

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

Printed on: April 16, 2024 at 15:04 o'clock

Member: bastla
bastla Mar 15, 2011 at 16:20:21 (UTC)
Goto Top
Hallo lionne!

Du hast zunächst ein Objekt namens "file" für die Dateien des durchsuchten Ordners erzeugt, und in Zeile 16 den selben Variablenname für die auszulesende Datei verwendet - das kann so nicht gut gehen ...

Wenn Du übrigens mehrere Zeilen darauf hin überprüfen willst, ob es eine passend benannte "pdf"-Datei gibt, würde ich vorweg alle diese Dateinamen (klein geschrieben) in einen einzigen String (zB mit Trennzeichen ":") packen
:dateiname1:dateiname2:...:dateiname153:
und müsste dann nur noch diesen String (nach dem Teilstring zB ":dateiname5:" durchsuchen ...

Grüße
bastla

P.S.: Wenn Du Variablen per "Dim" deklarierst, dann aber konsequenter Weise auch ein "Option Explicit" an den Anfang setzen ...
Member: lionne
lionne Mar 15, 2011 at 20:11:32 (UTC)
Goto Top
Hallo bastla,

danke für deinen Hinweis. Ich habe es korrigiert.

Das Problem, das ich momentan habe ist:

Ich versuche 2 Strings zu vergleichen
- String1 aus einer Spalte der CSV-Datei und String2 aus pdf-Dateiname und ich bekomme immer das Ergebnis, dass beide String nicht gleich sind. (siehe Zeile 39)

- Und beim erstellen des Verzeichnis habe ich folgende Fehlermeldung: ##red code: 800A0034 --> Bad file name or number (siehe Zeile 59)

Kann bitte Jemand mir einen Tipp geben, was falsch ist?

Mein Code:
    Option Explicit
Const forReading = 1
Dim fso, file, column
Dim textline 'TextZeile  
Dim inputDir, targetTypeCsv, targetTypePdf, filenamePdf
Dim datumAb, filenameAusCsv, filePdf
Dim folder, folders, ZielPfad, archiveDir, filePfad

Set fso = CreateObject("Scripting.FileSystemObject")  
inputDir = "C:\Temp\Test\"  
archiveDir = "E:\Load\ArchivFile\"  

targetTypeCsv = "csv"  
targetTypePdf = "pdf"  

For Each file In fso.GetFolder(inputDir).Files 'alle Dateien des inputDirs durchgehen  
    
    '1. CVS Dateien nach eineinder öffnen und 'Datum und Dateiname in einer Array auslesen  
    If LCase(fso.GetExtensionName(file.Name)) = LCase(targetTypeCsv) Then 'Test Datei-Typ  

        Set file = fso.OpenTextFile(file, forReading, False)
        While Not file.AtEndOfStream
            textline = file.Readline()
            column = Split(textline, "|")  
            
            datumAb = column(43)
            filenameAusCsv = column(44)
        
    Wend
file.Close 'Datei Schliessen  

    End If
    
    '2. Alle pdf Dateien in Odner durchgehen und prüfen, ob eine die gleiche Dateiname wie die "gelesene Dateiname" hat  
    For Each filePdf In fso.GetFolder(inputDir).Files
        If LCase(fso.GetExtensionName(filePdf.Name)) = LCase(targetTypePdf) Then
            filenamePdf = Trim(filePdf.Name)
           
            If filenameAusCsv = Trim(filenamePdf) Then 'Hier bekomme ich die Meldung, dass beiden Dateiname nicht sind und das stimmt nicht  
                '3 Wenn vorhanden, dann Ordner aus Datum bauen und die gefundene Datei umbenenen und reinspeichern  
                
                    folders = Array(Left(datumAb, 5), Mid(datumAb, 5, 2), Right(datumAb, 2)) 'Folders = Array(JJJJ, MM, TT)  
                    '----------------Ausgabe am Bildschirm ------------------  
                   MsgBox "datumAb: " & datumAb          'datumAb = 20110319  
                   MsgBox "Jahr: " & Left(datumAb, 5)    'Left(datumAb, 5) --> ergibt 201 statt 2011  
                   MsgBox "Monat: " & Mid(datumAb, 5, 2) 'Mid(datumAb, 5, 2) --> ergibt 10 statt 03  
                   MsgBox "Tag: " & Right(datumAb, 2)    'Right(datumAb, 2) --> ergibt 4 statt 15  
                   '-----------------------------------------------------------  
                    
                Else: MsgBox "Dateiname sind: " & "nicht gleich"  
               
                
                'ZielPfad = ZielOrdner (für jede Datei erneut den ZielOrdner (Start-Ordner) vorgeben)  
                ZielPfad = archiveDir
                
                'Odner erstellen  
                For Each folder In folders
                    ZielPfad = ZielPfad & "\" & folder 'zielPfad um jeweiligen Teilpfad verlängern  
                    If Not fso.folderExists(ZielPfad) Then fso.CreateFolder (ZielPfad) 'Fhlermeldung  'code: 800A0034 --> Bad file name or number  
                Next
                
                'Dateien verschieben  
                If Not fso.FileExists(ZielPfad & "\" & filePdf.Name) Then 'gleichnamige Datei bereits vorhanden?  
                    filePdf.Move ZielPfad & "\"  'Zielangabe mit abschließendem "\" = Ordner  
                End If
                
            End If    'filenameAusCsv = filenamePdf  
                
        End If
    Next '2  
    
Next '1  

Danke im Voraus
Lionne
Member: bastla
bastla Mar 15, 2011 at 20:25:34 (UTC)
Goto Top
Hallo lionne!

Vorweg: Du verwendest immer noch die Variable "file" für zwei verschiedene Zwecke (was zumindest kein guter Stiil ist) ...

Du könntest allerdings aus dem Dateiobjekt "file" per "OpenAsTextStream"-Methode den gesamten Inhalt in eine Variable einlesen - zB
rows = Split(file.OpenAsTextStream.ReadAll, vbCrLf)
und erhieltest damit ein (0-basiertes) Array "rows()", dessen erste oder letzte Zeile sich mit
columns = Split(rows(0), "|"
bzw
columns = Split(rows(UBound(rows)), "|"
auslesen ließe ...
Besteht Deine jeweilige "csv"-Datei nur aus einer Zeile, bzw befindet sich die gesuchte Information in der letzten Zeile? So wäre zumindest Deine Vorgangsweise zu deuten ...
- String1 aus einer Spalte der CSV-Datei und String2 aus pdf-Dateiname und ich bekomme immer das Ergebnis, dass beide String nicht gleich sind. (siehe Zeile 39)
Können sie ja eigentlich nicht sein, da Du ja Name + Extension vergleichst - verwende die Methode "GetBaseName" (und beachte ggf auch die Groß-/Kleinschreibung)
Wenn "datumAb" den Inhalt "20110319" hat, wieso willst Du dann für das Jahr die ersten ("Left") 5 Stellen verwenden? Und "ergibt 4 statt 15" ergibt für mich in diesem Zusammenhang (der Tag wäre "19") überhaupt keinen Sinn ...
Noch zur Zeile 59: Lass Dir doch einfach vorweg jeweils den Zielpfad ausgeben (wobei ich anstelle einer "MsgBox" lieber "WScript.Echo" verwenden, und dann das Script über
cscript //nologo Script.vbs
aus einer CMD-Shell starte - erspart eine Menge "OK"-Klickerei), um dem Fehler auf die Spur zu kommen ...

Grüße
bastla
Member: lionne
lionne Mar 15, 2011 at 21:05:08 (UTC)
Goto Top
Hallo bastla,

vielen Dank für diene Antwort. Meine CSV Datei besteht aus mehreren Zeilen und die Iformationen, die ich brauche sind immer in der Spalten Nr. 43 und 44 gespeichert

Gruß
Lionne
Member: bastla
bastla Mar 15, 2011 at 21:18:12 (UTC)
Goto Top
Hallo lionne!

Wenn demnach jede Zeile jeder Datei zu verarbeiten ist, müsste der gesamte Teil 2 (+ 3) innerhalb der "csv"-Verarbeitungsschleife - egal, ob mit zeilenweisem Einlesen oder der "ReadAll"-Variante und danach
For Each row In rows
    column = Split(row, "|")  
    ....
    'Teil 2  
Next
Grüße
bastla
Member: lionne
lionne Mar 16, 2011 at 09:46:14 (UTC)
Goto Top
Hallo bastla,

ich verstehe nicht weiss du meinst. Kannst du bitte noch erklären?
Danke und Gruß
Lionne

Zitat von @bastla:
Hallo lionne!

Wenn demnach jede Zeile jeder Datei zu verarbeiten ist, müsste der gesamte Teil 2 (+ 3) innerhalb der
"csv"-Verarbeitungsschleife - egal, ob mit zeilenweisem Einlesen oder der "ReadAll"-Variante und danach
For Each row In rows
>     column = Split(row, "|")  
>     ....
>     'Teil 2  
> Next
> 
Grüße
bastla
Member: bastla
bastla Mar 16, 2011 at 10:24:18 (UTC)
Goto Top
Hallo lionne!

Derzeit wird aus jeder "csv"-Datei nur die letzte Zeile verwendet - innerhalb der Schleife (Zeilen 22 bis 29) werden ja die Variablen "datumAb" und "filenameAusCsv" immer wieder überschrieben, sodass nach Zeile 29 die Werte der letzten Zeile in diesen Variablen enthalten sind - dann erst (und daher nur einmal je "csv"-Datei") wird die passende "pdf"-Datei verarbeitet (Schritte 2 und 3).

Soll dies allerdings für jede Zeile der "csv"-Datei erfolgen, müssten die Zeilen 29 bis 32 nach unten in die Zeile 71 "wandern" ...

Grüße
bastla

P.S.: Anstelle von "While - Wend" gäbe es inzwischen "Do While - Loop" ...
Member: lionne
lionne Mar 16, 2011 at 11:08:52 (UTC)
Goto Top
Danke bastla. Ich habe es jetzt verstanden
Mitglied: 76109
76109 Mar 16, 2011 at 13:10:07 (UTC)
Goto Top
Hallo Lionne!

Ergänzend zu baslta's Kommentar:
Und beim erstellen des Verzeichnis habe ich folgende Fehlermeldung: ##red code: 800A0034 --> Bad file name or number (siehe Zeile 59)
Kein Wunder, da in der Variablen 'DatumAb' (Csv-Spalte 44 alias Array-Column(43)) mit Sicherheit kein Datum im Format "20110319" vorzufinden ist.

Und egal wie, dies stimmt ebenfalls nicht (hat bastla aber auch schon drauf hingewiesen!):
folders = Array(Left(datumAb, 5), Mid(datumAb, 5, 2), Right(datumAb, 2)) 'Folders = Array(JJJJ, MM, TT)   

Laß Dir den Inhalt der Variablen 'DatumAb' in einer MsgBox ausgeben (MsgBox DatumAb) oder besser noch, schau in Excel oder im Text-Editor nach, was in der Csv-Datei-Datums-Spalte tatsächlich drinn steht (eine Zahl oder ein Datum in anderem Format...?).

Und bitte bitte, gib unterschiedlichen Datei-Objecten auch unterschiedliche Variablen-Namen. Das betrifft die Variable 'File' in Codezeile 16 und 21. Ein Each-Object sollte innerhalb der Schleife bis zum Next-Object seine Gültigkeit behalten und nicht nochmal für ein anderes Object (Set File) innerhalb der Schleife missbraucht werden. Das zeugt von schlechtem Programmierstil und verursacht Fehler.

Gruß Dieter
Member: lionne
lionne Mar 16, 2011 at 13:15:45 (UTC)
Goto Top
Hallo bastla,

das Script funktioniert jetzt wie ich mir vorgestellt habe. Die ausgaben aus der csv-Datei werde ich später in einer Variable speicher und wolte erstmal das Skript zu laufen bringen bevor ich noch grosse Änderungen mache.

Eine Frage: Kannst du mir bitte sagen warum die pdf Dateien nicht verschoben werden(siehe Zeile 58)? Was habe ich da falsch gemacht. Bitte einen Tipp, ich hänge schon seit 30 min drauf

Danke und Gruß
Lionne

Option Explicit
Const forReading = 1
Dim fso, file, column
Dim textline 'TextZeile  
Dim inputDir, targetTypeCsv, targetTypePdf, filenamePdf
Dim datumAb, filenameAusCsv, filePdf
Dim folder, folders, ZielPfad, archiveDir, filePfad, rows

Set fso=CreateObject("Scripting.FileSystemObject")  
inputDir = "C:\Temp\Test\"  
archiveDir	=	"E:\\Archiv\ArchivDateien\"				  


targetTypeCsv = "csv"  
targetTypePdf = "pdf"  

For Each file In fso.GetFolder(inputDir).Files 'alle Dateien des inputDirs durchgehen  
	
	'1. CVS Dateien nach eineinder öffnen und 'Datum und Dateiname in einer Array auslesen  
	If LCase(fso.GetExtensionName(file.Name)) = LCase(targetTypeCsv) Then 'Test Datei-Typ  

		Set file = fso.OpenTextFile(file, forReading, False)
		
		Do While not file.AtEndOfStream 'while not file.AtEndOfStream  
			textline=file.Readline()
			column=Split(textline,"|")  
			
			'--------------------Werte speichern-------------------------  
			datumAb 		= column(43) 
			filenameAusCsv = column(44) 
		
	'*** 2.   Dateiname.pdf  = "gelesene Dateiname" ?****************  
		For Each filePdf In fso.GetFolder(inputDir).Files 'alle Dateien des inputDirs durchgehen  
	
			If LCase(fso.GetExtensionName(filePdf.Name)) = LCase(targetTypePdf) Then 
				
				filenamePdf = fso.GetBaseName(filePdf.Name) 'z.B. Meine_Datei_20110310.pdf, dann filenamePdf = Meine_Datei_20110310  
				Folders = Array(Mid(datumAb, 2,4), Mid(datumAb, 6, 2), Mid(datumAb, 8,2)) 'Folders = Array(JJJJ, MM, TT) 'datumAb = "20110315"  
				
				if Mid(filenameAusCsv, 2,18) = filenamePdf Then ' filename aus Csv-Datei = Pdf filename ?  
					
					'3a. ZielPfad = ZielOrdner (für jede Datei erneut den ZielOrdner (Start-Ordner) vorgeben)  
					zielPfad = archiveDir
					
					'3b. Wenn vorhanden, dann Ordner aus datumAb erstellen  
					For Each folder In  folders
						zielPfad = zielPfad & "\" & folder 'zielPfad um jeweiligen Teilpfad verlängern   
						If Not fso.folderExists(zielPfad) Then fso.CreateFolder(zielPfad) 'und bei Bedarf erstellen  
					Next '3b  
					
				Else
				'----------------Ausgabe am Bildschirm ------------------  
				'wscript.echo "nicht gleich: " & "Nein"  
				'----------------------------------- ------------------  
					
				'3c Test FileExists(ZielPfad & ...), Datei.Move --> Datei Verschieben  
					If Not fso.FileExists(ZielPfad & "\" & filePdf.Name) Then 'gleichnamige Datei bereits vorhanden? 					  
						filePdf.Name.Move  ZielPfad & "\" 'Zielangabe mit abschließendem "\" = Ordner  
					End If '3c  
					
				End if 'filename aus Csv-Datei = Pdf filename ?				  
			End if ' LCase...  
		Next 'Each filePdf  
	'****2 Ende**********************************************************************************************************************************		  
						
	loop'wend		  
file.Close 
	End If 'Test Datei-Typ		  
Next '1 For  
Mitglied: 76109
76109 Mar 16, 2011 at 13:33:52 (UTC)
Goto Top
Hallo Lionne!

Versuch mal in Codezeile 58 mit:
filePdf.Move ZielPfad & "\"  

Gruß Diete
Member: lionne
lionne Mar 16, 2011 at 13:43:10 (UTC)
Goto Top
Hallo Dieter,

danke. Ich habe raus gefunden: es gabt 2 Fehlern.

Fehler 1: die If-Schleife(Zeile 56-59) lagt ausserhalb des Block. Musste vor der Schleife 51 liegen.

Fehler 2: filePdf.Name.Move --> habe ich korrigiert

Gruß
Lionne
Mitglied: 76109
76109 Mar 16, 2011 at 14:35:40 (UTC)
Goto Top
Hallo Lionne!

Da frage ich mich natürlich, warum Du für jede einzelne Csv-Zeile noch zusätzlich jedesmal alle Pdf-Dateien einliest und dann einen Namens-Vergleich machst, anstatt mit dem Csv-Spalte-Dateinamen einen FileExist-Test zu machen und dann gegebenenfalls zu verschieben?

In welchem Format steht denn jetzt eigentlich der Dateiname in der Csv-Datei bzw. inwiefern unterscheidet der sich vom Namen der Pdf-Datei?

Gruß Dieter
Member: lionne
lionne Mar 16, 2011 at 16:25:31 (UTC)
Goto Top
Zitat von @76109:
Hallo Lionne!

Da frage ich mich natürlich, warum Du für jede einzelne Csv-Zeile noch zusätzlich jedesmal alle Pdf-Dateien
einliest und dann einen Namens-Vergleich machst, anstatt mit dem Csv-Spalte-Dateinamen einen FileExist-Test zu machen und dann
gegebenenfalls zu verschieben?

In welchem Format steht denn jetzt eigentlich der Dateiname in der Csv-Datei bzw. inwiefern unterscheidet der sich vom Namen der
Pdf-Datei?

Gruß Dieter

Hallo Dieter,

ich habe CSV Dateien und Pdf zu verfügung. Beiden Dateien gehören zusammen und ich muss bevor ich die Pdf Datei verschiebe sicherstellen, dass die verschobenen Pdf Dateienname in eine CSV-Datei erhalten sind.

Was meinst du mit: FileExist-Test?

sorry, wenn ich so blöde Frage Stelle. Ich bin ganz neu in der Programmierung Welt. Und wenn ich hier auf "administrator"Seite sehe, was hier so programmiert und wie hier Problem lösst, frage ich mich immer wie lange ich brauchen werde um so gut wie auch zu sein.

Gruß
Lionne
Member: bastla
bastla Mar 16, 2011 at 17:44:26 (UTC)
Goto Top
Hallo lionne!

Gemeint ist einfach, dass Du, nachdem der Name der "pdf"-Datei ausgelesen wurde, ja nicht den gesamten Ordner durchsuchen musst, sondern ganz gezielt mit
PDFPath = inputDir & "\" & Mid(filenameAusCsv, 2,18)  
If fso.FileExists(PDFPath) Then
das Vorhandensein der entsprechenden Datei feststellen kannst - zum Verschieben wäre dann "fso.MoveFile" zu verwenden ...

Noch eine Frage zu
Mid(filenameAusCsv, 2,18)
Ließe sich hier der entsprechende Teilstring nicht anhand von Trennzeichen bestimmen?

Grüße
bastla
Mitglied: 76109
76109 Mar 16, 2011 at 18:02:33 (UTC)
Goto Top
Hallo Lionne!

Also, in Deinem Skript liest Du ja die Dateinamen der Pdf-Datei aus und dann liest Du zusätzlich alle Pdf-Dateien ein und vergleichst den Namen mit dem Namen aus der Csv-Datei, anstatt - mit dem Pdf-Namen aus der Csv-Datei den Du ja bereits hast - zu prüfen, ob die Pdf-Datei im 'InputDir' existiert.

Du machst Dir ja leider nicht die Mühe, gestellte Fragen zu beantworten! Von daher schematisch in etwa so:
filenameAusCsv = column(44)
....
If Fso.FileExist(InputDir & filenameAusCsv & ?????) Then 
....
End if

Gruß Dieter

[edit] zu langsam [/edit]

@bastla
Das "/" ist im InputDir schon drinnenface-wink
Member: lionne
lionne Mar 16, 2011 at 18:06:28 (UTC)
Goto Top
Zitat von @bastla:
Ließe sich hier der entsprechende Teilstring nicht anhand von Trennzeichen bestimmen?

Hallo bastla,

nicht das ich wuste. In der csv-Datei steht der Name zwischen Hochkomma z.B. |"Beispieldatei.pdf"|

Das Datum genauso.

Danke und Gruß
Lionne
Member: bastla
bastla Mar 16, 2011 at 18:13:09 (UTC)
Goto Top
Hallo lionne!

Das sichere Entfernen der (aller) Hochkommata kannst Du gleich mit
<code tpye="plain">filenameAusCsv = Replace(column(44), """", "")

durchführen - dann ist es egal, wie lang der String ist.

Ansonsten wäre auch
<code tpye="plain">filenameAusCsv = column(44)
filenameAusCsv = Mid(filenameAusCsv, 2, Len(filenameAusCsv) - 2)

noch sicherer als die Angabe einer konstanten Länge ...

Grüße
bastla
Mitglied: 76109
76109 Mar 16, 2011 at 18:24:56 (UTC)
Goto Top
@lionne und @bastla

Falls 44 nicht gerade die letzte Spalte ist, dann ließe sich das auch so erledigen:
Columns = Split(CsvLine, """|""")  

Gruß Dieter
Member: bastla
bastla Mar 16, 2011 at 18:34:58 (UTC)
Goto Top
@Dieter
Das "/" ist im InputDir schon drinnenface-wink
Ist zwar ein "\" face-wink, aber macht auch nix (und noch nicht mal 3 "\" wären ein Problem) ...

Grüße
bastla
Member: lionne
lionne Mar 17, 2011 at 10:00:06 (UTC)
Goto Top
Hallo Zusammen,

vielen Dank für die zahlreiche Antwort und Tipps. Ich schließe jetzt die Frage und setze es als gelöst

Danke und Gruß,
Lionne
Mitglied: 76109
76109 Mar 17, 2011 at 12:14:21 (UTC)
Goto Top