Hta und Vbscript - Dateien mit Array filtern - automatisch umbenennen und bei bestimmten Dateien eine Nummerierung dem Dateinamen hinzufügen
In einem Ordner befinden sich gepackte Dateien im zip,tar und rar Format. Der Ordner wird auf Vorhandensein dieser Formate abgefragt und wenn ja werden die Dateinamen in eine Textdatei geschrieben.
Diese wird ausgelesen und eine Listbox in der HTA wird damit gefüllt.
Danach ist eine mehrfach Selektion der Dateien welche man entpacken will , möglich.
Hat man dann seine Wahl getroffen und die Dateien sind entpackt sollen diese mittels eines Arrays , das auf bestimmte Dateiendungen abfragt, gefiltert werden.
Danach sollen die entpackten Dateien den Namen der gepackten Datei erhalten (ohne Endung) und die Endung der entpackten Datei.
Meistens enthält eine gepackte Datei nur 1 Datei,wenn doch mal 2 oder mehr vorhanden sind,sollen diese automatisch eine Nummerierung erhalten.
Beispiel einzelne Datei:
Name der gepackten Datei
Name der entpackten Datei
daraus soll dann werden
Beispiel mehrere Dateien:
Name der gepackten Datei
Name der entpackten Dateien
daraus soll dann werden
Bis hierhin funktioniert meine Hta mit Vbscript schon. Die automatische Umbenennung funktioniert nur bei gepackten Dateien die 1 Datei enthalten (hiervon kann ich auch mehrere auswählen).
Sobald aber eine Kombination von gepackten Dateien ausgewählt wird (die 1 und 2 Dateien beeinhalten) funktioniert die automatische Nummerierung nicht mehr.
Ich finde den Fehler einfach nicht und wollte fragen ob mir hierbei jemand bitte helfen könnte.
Hier der Code für die Umbenennung und Nummerierung:
moveordner = Ordner in dem die Dateien entpackt werden
zielfolder = Hier werden die umbenannten Dateien hin verschoben
sTyp = Dateiendungen
aTypen= Array ("xls", "doc") usw,,,,
objitem.value = Name der gepackten Datei,ausgelesen aus der Textdatei (für die Listbox)
Vielen Dank für eure Hilfe
Sollte der komplette Code benötigt werden,bitte ich um kurze Antwort hier und ich werde dann mein Posting editieren.
Gruß
Claus
Diese wird ausgelesen und eine Listbox in der HTA wird damit gefüllt.
Danach ist eine mehrfach Selektion der Dateien welche man entpacken will , möglich.
Hat man dann seine Wahl getroffen und die Dateien sind entpackt sollen diese mittels eines Arrays , das auf bestimmte Dateiendungen abfragt, gefiltert werden.
Danach sollen die entpackten Dateien den Namen der gepackten Datei erhalten (ohne Endung) und die Endung der entpackten Datei.
Meistens enthält eine gepackte Datei nur 1 Datei,wenn doch mal 2 oder mehr vorhanden sind,sollen diese automatisch eine Nummerierung erhalten.
Beispiel einzelne Datei:
Name der gepackten Datei
Abteilung Lohnbuchhaltung.zip
Name der entpackten Datei
müller.xls
daraus soll dann werden
Abteilung Lohnbuchhaltung.xls
Beispiel mehrere Dateien:
Name der gepackten Datei
Abteilung Lagerhaltung.zip
Name der entpackten Dateien
maier test-a.xls
maier test-b.xls
maier test-b.xls
daraus soll dann werden
Abteilung Lagerhaltung - 1.xls
Abteilung Lagerhaltung - 2.xls
Abteilung Lagerhaltung - 2.xls
Bis hierhin funktioniert meine Hta mit Vbscript schon. Die automatische Umbenennung funktioniert nur bei gepackten Dateien die 1 Datei enthalten (hiervon kann ich auch mehrere auswählen).
Sobald aber eine Kombination von gepackten Dateien ausgewählt wird (die 1 und 2 Dateien beeinhalten) funktioniert die automatische Nummerierung nicht mehr.
Ich finde den Fehler einfach nicht und wollte fragen ob mir hierbei jemand bitte helfen könnte.
Hier der Code für die Umbenennung und Nummerierung:
moveordner = Ordner in dem die Dateien entpackt werden
zielfolder = Hier werden die umbenannten Dateien hin verschoben
sTyp = Dateiendungen
aTypen= Array ("xls", "doc") usw,,,,
objitem.value = Name der gepackten Datei,ausgelesen aus der Textdatei (für die Listbox)
For Each sTyp In aTypen 'Dateitypen
For Each oFile In fso.GetFolder(moveordner).Files 'Quelldateien
If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then
oname = Left(objitem.value, InStrRev(objitem.value, ".") - 1)
ofile_endung = Right(ofile.name, 3)
ofile.name = oname & "." & ofile_endung
if not objfso.FileExists(zielfolder & "\" & ofile.name) and not ofilecounter > 1 then
msgbox "Datei wird in zielfolder verschoben"
ofile.Move zielfolder
ofilecounter = ofilecounter + 1
if not (movefolder & "\" & oname) = (zielfolder & "\" & oname) then
ofilecounter = 0
end if
end if
if ofilecounter = 2 then
msgbox "Dateiverarbeitung von mehreren Dateien"
k = k + 1
fz = " - Teil " & (k)
ofile.name = oname & fz & "." & ofile_endung
else
msgbox "Datei " & ofile.name & " wird in den Zielfolder verschoben"
ofile.move zielfolder
ofilecounter = 0
end if
end if
next
next
'###################################################################################################
'
' Alle verbliebenen Dateien im moveordner löschen
'
'###################################################################################################
Set objFolder = objFSO.GetFolder(moveordner)
For each dFile in objFolder.Files
dFile.Delete
next
End If
Next
Vielen Dank für eure Hilfe
Sollte der komplette Code benötigt werden,bitte ich um kurze Antwort hier und ich werde dann mein Posting editieren.
Gruß
Claus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 174222
Url: https://administrator.de/contentid/174222
Ausgedruckt am: 17.11.2024 um 07:11 Uhr
16 Kommentare
Neuester Kommentar
Hallo cbli!
Abgesehen davon, dass ich vernünftige Einrückungen und als Zeilen 5 und 6 eher
verwenden würde: Wie erfolgt (da ja mehrere Dateien entpackt werden können) die Zuordnung zur Archivdatei oder ist davon auszugehen, dass sich in "moveordner" jeweils nur die Dateien eines Archivs befinden?
Grüße
bastla
Abgesehen davon, dass ich vernünftige Einrückungen und als Zeilen 5 und 6 eher
oname = fso.GetBaseName(objitem.Value)
ofile_Endung = fso.GetExtensionName(ofile.name)
Grüße
bastla
Hallo cbli!
Soferne nicht geprüft werden muss, ob es eine gleichnamige Zieldatei (aus einem früheren Entpackungsvorgang) bereits gibt, würde ich das etwa so versuchen:
Es wäre natürlich auch möglich, wenn es nur eine Datei gibt, diese bereits vor dem Verschieben vom Zusatz " - 1" zu befreien; das nachträgliche Umbenennen habe ich wegen der Ausgabe (für die ich ansonsten nochmals eine Unterscheidung zwischen 1 und mehreren Dateien benötigt hätte) erst im "zielfolder" durchgeführt ...
Grüße
bastla
[Edit] Fehlenden "." in Zeile 15 hinzugefügt und "zielordner" korrigiert[/Edit]
Soferne nicht geprüft werden muss, ob es eine gleichnamige Zieldatei (aus einem früheren Entpackungsvorgang) bereits gibt, würde ich das etwa so versuchen:
oname = fso.GetBaseName(objitem.Value)
For Each sTyp In aTypen 'Dateitypen
ofilecounter = 0
For Each oFile In fso.GetFolder(moveordner).Files 'Quelldateien
If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then
ofilecounter = ofilecounter + 1
ofile_Endung = fso.GetExtensionName(oFile.Path) 'nur erforderlich, wenn Groß-/Kleinschreibung des Typs "original" übernommen werden soll - ansonsten würde sTyp ohnehin bereits zur Verfügung stehen
oFile.Name = oname & " - " & ofilecounter & "." & ofile_Endung 'jede Datei umbenennen und mit lfd Nummer versehen
End If
Next
If ofilecounter > 0 Then 'Wenn es Dateien des untersuchten Typs gab ...
fso.MoveFile moveordner & "\" & oname & "*." & sTyp, zielordner '... alle auf einmal verschieben
If ofilecounter = 1 Then 'Wenn es nur eine Datei war, ...
fso.GetFile(zielordner & "\" & oname & " - 1." & sTyp).Name = oname & "." & sTyp '... die Laufnummer (" - 1") wieder entfernen
WScript.Echo "1 " & sTyp & "-Datei wurde in zielordner verschoben"
Else
WScript.Echo ofilecounter & " " & sTyp & "-Dateien wurden in zielordner verschoben"
End If
End If
Next
'###################################################################################################
'
' Alle verbliebenen Dateien im moveordner löschen
'
'###################################################################################################
Set objFolder = fso.GetFolder(moveordner)
For Each dFile In objFolder.Files
dFile.Delete
Next
Grüße
bastla
[Edit] Fehlenden "." in Zeile 15 hinzugefügt und "zielordner" korrigiert[/Edit]
Hallo cbli!
Da die Files-Auflistung die umbenannten Dateien im Quellordner ein zweites Mal erfasst, eine etwas abgewandelte Vorgangsweise:
Grüße
bastla
Da die Files-Auflistung die umbenannten Dateien im Quellordner ein zweites Mal erfasst, eine etwas abgewandelte Vorgangsweise:
If Right(zielordner, 1) <> "\" Then zielordner = zielordner & "\"
For Each sTyp In aTypen 'Dateitypen
ofilecounter = 0
For Each oFile In fso.GetFolder(moveordner).Files 'Quelldateien
If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then
ofilecounter = ofilecounter + 1
oFile.Name = oname & " - " & ofilecounter & "." & sTyp 'jede Datei umbenennen und mit lfd Nummer versehen und ...
oFile.Move zielordner '... gleich verschieben
End If
Next
If ofilecounter = 1 Then 'Wenn es nur eine Datei war, ...
fso.GetFile(zielordner & oname & " - 1." & sTyp).Name = oname & "." & sTyp '... die Laufnummer (" - 1") wieder entfernen
WScript.Echo "1 " & sTyp & "-Datei wurde in zielfolder verschoben"
ElseIf ofilecounter > 1 Then
WScript.Echo ofilecounter & " " & sTyp & "-Dateien wurden in zielfolder verschoben"
End If
Next
Kann man bei einem Move Befehl irgendwie erreichen,daß eine bereits vorhandene Datei überschrieben wird ?
Nein; ein "Move
" oder "MoveFile
" kann existierende Zieldateien nicht überschreiben.Grüße
bastla
Hallo cbli!
Du kannst ja die gleiche Vorgangsweise wie oben wählen, um nur die "sTyp"-Dateien zu verarbeiten und dann nur den Dateinamen prüfen:
Noch einfacher wäre es natürlich, wenn nur das Vorhandensein von "sample" im Dateinamen geprüft werden müsste - dann würde "
Grüße
bastla
Du kannst ja die gleiche Vorgangsweise wie oben wählen, um nur die "sTyp"-Dateien zu verarbeiten und dann nur den Dateinamen prüfen:
CheckFor = "sample"
LCheckFor = Len(CheckFor) 'Länge nur ein einziges Mal ermitteln
For Each sTyp In aTypen 'Dateitypen
For Each sampleFile In fso.GetFolder(moveordner).Files 'Quelldateien
If LCase(fso.GetExtensionName(sampleFile.Path)) = sTyp Then
sampleFileName = LCase(fso.GetBaseName(sampleFile.Path))
If Right(sampleFileName, LCheckFor) = CheckFor Or Left(sampleFileName, LCheckFor) = CheckFor Then sampleFile.Delete
End If
Next
Next
InStr()
" reichen ...Grüße
bastla
Hallo cbli!
Vielleicht beschreibst Du nochmals, wie die veränderte Zielsetzung lautet ...
Dein Ansatz versucht in den Zeilen 34 - 37, eine ev bereits gelöschte / verschobene Datei nochmals zu verarbeiten ...
[Edit] Falls ich das richtig interpretiere, soll eine vorhandene Datei nur durch eine größere Datei überschrieben werden; in diesem Fall etwa so (ungetestet):
[/Edit]
[Edit2] In Zeile 21 "moveordner" auf "zielfolder" geändert [/Edit2]
Grüße
bastla
Vielleicht beschreibst Du nochmals, wie die veränderte Zielsetzung lautet ...
Dein Ansatz versucht in den Zeilen 34 - 37, eine ev bereits gelöschte / verschobene Datei nochmals zu verarbeiten ...
[Edit] Falls ich das richtig interpretiere, soll eine vorhandene Datei nur durch eine größere Datei überschrieben werden; in diesem Fall etwa so (ungetestet):
'###################################################################################################
' Dateien umbenennen,nummerieren und in Zielordner verschieben
'###################################################################################################
oname = fso.GetBaseName(objitem.Value)
If Right(zielfolder, 1) <> "\" Then zielfolder = zielfolder & "\"
For Each sTyp In aTypen 'Dateitypen
ofilecounter = 0
For Each oFile In fso.GetFolder(moveordner).Files 'Quelldateien
If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then
ofilecounter = ofilecounter + 1
oFile.Name = oname & " - cd" & ofilecounter & "." & sTyp 'jede Datei umbenennen und mit lfd Nummer versehen und ...
WScript.Echo ofile.name
If fso.FileExists(zielfolder & oFile.Name) Then 'Zieldatei
Set oFileZiel = fso.GetFile(zielfolder & oFile.Name)
If oFileZiel.Size >= oFile.Size Then
oFile.Delete
Else
oFileZiel.Delete
oFile.Move zielfolder
End If
Else
oFile.Move zielfolder
End If
End If
Next
If ofilecounter = 1 Then 'Wenn es nur eine Datei war, ...
If fso.FileExists(zielfolder & oname & "." & sTyp) Then
If fso.GetFile(zielfolder & oname & "." & sTyp).Size >= fso.GetFile(zielfolder & oname & " - cd1." & sTyp).Size Then
fso.GetFile(zielfolder & oname & " - cd1." & sTyp).Delete
Else
fso.GetFile(zielfolder & oname & "." & sTyp).Delete
fso.GetFile(zielfolder & oname & " - cd1." & sTyp).Name = oname & "." & sTyp '... die Laufnummer (" - 1") wieder entfernen
End If
Else
fso.GetFile(zielfolder & oname & " - cd1." & sTyp).Name = oname & "." & sTyp '... die Laufnummer (" - 1") wieder entfernen
End If
WScript.Echo "1 " & sTyp & "-Datei wurde in zielfolder verschoben"
ElseIf ofilecounter > 1 Then
WScript.Echo ofilecounter & " " & sTyp & "-Dateien wurden in zielfolder verschoben"
End If
Next
'###################################################################################################
'
' Alle verbliebenen Dateien im moveordner löschen
'
'###################################################################################################
fso.DeleteFile moveordner & "\*.*". True
End If
Next
End Sub
[Edit2] In Zeile 21 "moveordner" auf "zielfolder" geändert [/Edit2]
Grüße
bastla