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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 162693
Url: https://administrator.de/forum/vbscript-fehlermeldung-mit-der-methode-getextensionname-162693.html
Ausgedruckt am: 17.05.2025 um 03:05 Uhr
22 Kommentare
Neuester Kommentar
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
und müsste dann nur noch diesen String (nach dem Teilstring zB "
Grüße
bastla
P.S.: Wenn Du Variablen per "
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:
: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 ...
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
und erhieltest damit ein (0-basiertes) Array "rows()", dessen erste oder letzte Zeile sich mit
bzw
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 ...
Wenn "datumAb" den Inhalt "20110319" hat, wieso willst Du dann für das Jahr die ersten ("
Noch zur Zeile 59: Lass Dir doch einfach vorweg jeweils den Zielpfad ausgeben (wobei ich anstelle einer "
aus einer CMD-Shell starte - erspart eine Menge "OK"-Klickerei), um dem Fehler auf die Spur zu kommen ...
Grüße
bastla
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)
columns = Split(rows(0), "|"
columns = Split(rows(UBound(rows)), "|"
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 übercscript //nologo Script.vbs
Grüße
bastla
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 "
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
" ...
Hallo Lionne!
Ergänzend zu baslta's Kommentar:
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!):
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
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) |
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

Hallo Lionne!
Versuch mal in Codezeile 58 mit:
Gruß Diete
Versuch mal in Codezeile 58 mit:
filePdf.Move ZielPfad & "\"
Gruß Diete

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
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 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
das Vorhandensein der entsprechenden Datei feststellen kannst - zum Verschieben wäre dann "
Noch eine Frage zu
Ließe sich hier der entsprechende Teilstring nicht anhand von Trennzeichen bestimmen?
Grüße
bastla
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
fso.MoveFile
" zu verwenden ...Noch eine Frage zu
Mid(filenameAusCsv, 2,18)
Grüße
bastla

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:
Gruß Dieter
[edit] zu langsam [/edit]
@bastla
Das "/" ist im InputDir schon drinnen
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 drinnen
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
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
@Dieter
, aber macht auch nix (und noch nicht mal 3 "\" wären ein Problem) ...
Grüße
bastla
Das "/" ist im InputDir schon drinnen
Ist zwar ein "\" Grüße
bastla
