Mit VBScript oder Batch Dateinamen und Dateiendung automatisch umbenennen
Hallo, Experten!
Ich brauche Eure Hilfe, da ich mit VBScripten und Batchen nicht so richtig auskenne.
Ich habe zwar schon versucht selber was zu schreiben, aber leider hatte bis jetzt noch kein richtiges Ergebnis.
Zu meinem Problem:
Mit einem TIF-Druckertreiber erstellen wir aus unserem Warenwirtschaftsystem die Belege für Archivsystem.
Die Datein mussen für Import Dateiendung *.tif haben. Der Drucker erstellt aber die Dateien
mit Endung *.000 und für folgende Dateien wird die Endung hexadezimal hochgezählt.
Jetzt am Beispiel:
Im Verzeichnis C:\Dokumente liegen nach dem Druck die Dateien:
Für den Import mussen die Dateien umbenannt werden und zwar so,
das die Dateiname aktuelles Datum + fortlaufenden Zähler und die Dateiendung *.tif bekommt:
Die vorhandene Dateien dürfen nicht überschrieben werden, sondern weiter hochgezählt.
Es wird von mehreren Clients in ein Verzeichnis im Netzwerk gedruckt und anschließend
soll sofort Script/Batch ausgeführt werden. (ich kann Script/Batch im TIF-Druckertreiber einbinden).
Ich weiß nicht was in diesem Fall besser ist VBScript oder Batch.
Ich denke Script, da beim Batch wird ja nach jedem Druckvorgang ein DOS-Fenster geöffnet und geschloßen,
und dieses Flackern wird bestimmt meinen Mitarbetern nicht gefallen.
Ich würde mich wirklich sehr freuen, wenn jemand für mein Problem was basteln könnte.
Ich bedanke mich schon mal im Voraus!
highpriest
Ich brauche Eure Hilfe, da ich mit VBScripten und Batchen nicht so richtig auskenne.
Ich habe zwar schon versucht selber was zu schreiben, aber leider hatte bis jetzt noch kein richtiges Ergebnis.
Zu meinem Problem:
Mit einem TIF-Druckertreiber erstellen wir aus unserem Warenwirtschaftsystem die Belege für Archivsystem.
Die Datein mussen für Import Dateiendung *.tif haben. Der Drucker erstellt aber die Dateien
mit Endung *.000 und für folgende Dateien wird die Endung hexadezimal hochgezählt.
Jetzt am Beispiel:
Im Verzeichnis C:\Dokumente liegen nach dem Druck die Dateien:
PRINT.000 PRINT.001 PRINT.002 usw. (sind aber die tif's)
Für den Import mussen die Dateien umbenannt werden und zwar so,
das die Dateiname aktuelles Datum + fortlaufenden Zähler und die Dateiendung *.tif bekommt:
PRINT160508_1.tif PRINT160508_2.tif PRINT160508_3.tif usw.
Die vorhandene Dateien dürfen nicht überschrieben werden, sondern weiter hochgezählt.
Es wird von mehreren Clients in ein Verzeichnis im Netzwerk gedruckt und anschließend
soll sofort Script/Batch ausgeführt werden. (ich kann Script/Batch im TIF-Druckertreiber einbinden).
Ich weiß nicht was in diesem Fall besser ist VBScript oder Batch.
Ich denke Script, da beim Batch wird ja nach jedem Druckvorgang ein DOS-Fenster geöffnet und geschloßen,
und dieses Flackern wird bestimmt meinen Mitarbetern nicht gefallen.
Ich würde mich wirklich sehr freuen, wenn jemand für mein Problem was basteln könnte.
Ich bedanke mich schon mal im Voraus!
highpriest
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 87823
Url: https://administrator.de/contentid/87823
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
16 Kommentare
Neuester Kommentar
abend
hab ma folgenden vbscript codeschnipsel zusammengepfercht!
brauchst eigentlich nur den verzeichnispfad anzugeben und kannst es probehalber ma rennen lassen!
nur eine frage, was is wenn der zähler über die dreistellige zahl hinausläuft?
gruss tacker
edit:
dank dem tageswechsel noch nen "fehler" entdeckt, deshalb bitte den folgenden code nehmen, wenn nicht an jedem tag für alle files ein neues .tif erstellt werden soll anstatt dem aktuellen datum wird das jeweilige erstellungsdatum der datei genommen.
hab ma folgenden vbscript codeschnipsel zusammengepfercht!
dim fso
set fso = createobject("scripting.filesystemobject")
verzeichnis = "C:\Dokumente und Einstellungen\bla"
set folder = fso.getfolder(verzeichnis)
set files = folder.files
for each file in files
if not right(file.name, 3) = "tif" then
newfile = left(file.path, instr(file.path, file.name)-1) & left(file.name, instr(file.name, ".")) & date() & "_" & right(file.name, 3) & ".tif"
if not fso.fileexists(newfile) then
file.copy(newfile)
end if
end if
next
brauchst eigentlich nur den verzeichnispfad anzugeben und kannst es probehalber ma rennen lassen!
nur eine frage, was is wenn der zähler über die dreistellige zahl hinausläuft?
gruss tacker
edit:
dank dem tageswechsel noch nen "fehler" entdeckt, deshalb bitte den folgenden code nehmen, wenn nicht an jedem tag für alle files ein neues .tif erstellt werden soll anstatt dem aktuellen datum wird das jeweilige erstellungsdatum der datei genommen.
dim fso
set fso = createobject("scripting.filesystemobject")
verzeichnis = "C:\Dokumente und Einstellungen\bla"
set folder = fso.getfolder(verzeichnis)
set files = folder.files
for each file in files
if not right(file.name, 3) = "tif" then
newfile = left(file.path, instr(file.path, file.name)-1) & left(file.name, instr(file.name, ".")) & left(file.datecreated, instr(file.datecreated, " ")-1) & "_" & right(file.name, 3) & ".tif"
if not fso.fileexists(newfile) then
file.copy(newfile)
end if
end if
next
Hallo highpriest und willkommen im Forum!
Aber gut, den Speicherplatz für die paar Zeilen, die ein VBScript gegenüber einem Batch mehr benötigt, werden wir wohl noch auftreiben ...
Der folgende Entwurf erzeugt, abweichend von Deiner Vorgabe, Dateinamen nach folgendem Schema: "PRINT20080517_0001.tif" - damit lassen sich die Dateien vor allem leichter sortieren.
Hinsichtlich der laufende Nummer bin ich davon ausgegangen, dass nicht an jedem Tag mit 1 begonnen, sondern, unabhängig vom Datum, immer weiter hochgezählt werden soll (sag Bescheid, falls dies nicht gewünscht sein sollte). Die Schreibweise mit führenden Nullen (Stellenanzahl siehe "Const Digits") erlaubt ggf eine einfachere Nachbearbeitung.
Den von tacker gemachten Vorschlag, anstelle des Tagesdatums das Erstellungsdatum der Originaldatei zu verwenden, finde ich ebenfalls sinnvoll (allerdings verwende ich das Änderungsdatum, um das Script etwas universeller einsetzbar zu machen).
Zusätzlich bin ich davon ausgegangen, dass die Reihenfolge der Dateien beibehalten werden soll - daher sortiere ich diese vorweg nach dem Änderungsdatum. Auch, wenn eigentlich jede Datei sofort verarbeitet werden sollte, sorge ich damit für den Fall vor, dass, bedingt durch das zwischenzeitliche Umbenennen, nachfolgende Dateien eine schon wieder frei gewordene niedrigere Nummer (also zB .000) vom Druckertreiber erhalten könnten (nähere Informationen dazu könntest Du uns noch geben). Außerdem kann so das Script auch unabhängig von einem "Ausdruck" ausgeführt werden, um alle noch nicht umbenannten Dateien nachträglich bearbeiten zu können.
Grüße
bastla
... dieses Flackern wird bestimmt meinen Mitarbetern nicht gefallen.
Würden sie lieber den Status Quo behalten? Aber gut, den Speicherplatz für die paar Zeilen, die ein VBScript gegenüber einem Batch mehr benötigt, werden wir wohl noch auftreiben ...
Der folgende Entwurf erzeugt, abweichend von Deiner Vorgabe, Dateinamen nach folgendem Schema: "PRINT20080517_0001.tif" - damit lassen sich die Dateien vor allem leichter sortieren.
Const Folder = "C:\Dokumente"
OldName = UCase("PRINT.") 'zur Erkennung der Originaldateien
Const NewName = "PRINT"
Const NewExtension = ".tif"
Const Digits = 4 'Stellenanzahl der laufenden Nummer
Const adVarChar = 200
Set DataList = CreateObject("ADOR.Recordset")
DataList.Fields.Append "FileName", adVarChar, 255
DataList.Fields.Append "FileDate", adVarChar, 20
DataList.Open
OldNameLen = Len(OldName)
MaxNo = String(Digits, "0")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Folder).Files
FN = File.Name
If UCase(Left(FN, OldNameLen)) = OldName Then
DataList.AddNew
DataList("FileName") = FN
FileDate = CStr(File.DateLastModified)
DataList("FileDate") = Mid(FileDate, 7, 4) & Mid(FileDate, 4, 2) & Mid(FileDate, 1, 2) & Mid(FileDate, 11)
DataList.Update
ElseIf InStrRev(FN, "_") Then
P1 = InStrRev(FN, "_") + 1
P2 = InStrRev(FN, ".")
If P2 > P1 Then
CurrNo = Mid(FN, P1, P2 - P1)
If Len(CurrNo) = Digits Then If CurrNo > MaxNo Then MaxNo = CurrNo
End If
End If
Next
No = CLng(MaxNo) + 1
If Not DataList.EOF Then
DataList.Sort = "FileDate"
DataList.MoveFirst
Do Until DataList.EOF
File = Folder & "\" & DataList.Fields.Item("FileName")
NewDate = Left(DataList.Fields.Item("FileDate"), 8)
NewNo = Right(String(Digits, "0") & CStr(No), Digits)
fso.GetFile(File).Name = NewName & NewDate & "_" & NewNo & NewExtension
No = No + 1
DataList.MoveNext
Loop
End If
Den von tacker gemachten Vorschlag, anstelle des Tagesdatums das Erstellungsdatum der Originaldatei zu verwenden, finde ich ebenfalls sinnvoll (allerdings verwende ich das Änderungsdatum, um das Script etwas universeller einsetzbar zu machen).
Zusätzlich bin ich davon ausgegangen, dass die Reihenfolge der Dateien beibehalten werden soll - daher sortiere ich diese vorweg nach dem Änderungsdatum. Auch, wenn eigentlich jede Datei sofort verarbeitet werden sollte, sorge ich damit für den Fall vor, dass, bedingt durch das zwischenzeitliche Umbenennen, nachfolgende Dateien eine schon wieder frei gewordene niedrigere Nummer (also zB .000) vom Druckertreiber erhalten könnten (nähere Informationen dazu könntest Du uns noch geben). Außerdem kann so das Script auch unabhängig von einem "Ausdruck" ausgeführt werden, um alle noch nicht umbenannten Dateien nachträglich bearbeiten zu können.
Grüße
bastla
Hallo highpriest!
Zumindest ein Detail wäre aber noch zu klären: Bei meinem Ansatz wird die nächste zu vergebende Laufnummer aufgrund der im Ordner bereits vorhandenen nummerierten Dateien ermittelt. Falls diese nun alle verschoben worden sein sollten, würde wieder bei "0001" (die Anzahl der Nullen/Stellen kannst Du selbst wählen) begonnen - daher nochmals die Bitte um eine Erläuterung des weiteren Ablaufs (nach dem Umbenennen) ...
Sollten tatsächlich regelmäßig alle nummerierten Dateien aus dem Ordner entfern werden, könnte ergänzend die jeweils höchste bereits verwendete Laufnummer in einer (.ini-) Datei hinterlegt und bei der Vergabe der nächsten Nummer berücksichtigt werden (oder gleich die bisher vorgesehene Ermittlung auf Basis der vorhandenen Dateien ersetzen).
[Edit] Ach ja: Gibt es im Ordner außer den "SCAN*.tif"-Dateien noch weitere Dateien? Wenn ja, nach welchen Konventionen sind diese benannt? (In der aktuellen Scriptfassung werden nämlich die umbenannten Dateien nur sehr oberflächlich anhand des enthaltenen "_" identifiziert - hier werde ich auf jeden Fall noch nachbessern.) [/Edit]
Grüße
bastla
Dann kann es nichts mehr schief gehen.
Hoffen wir mal das Beste ... Zumindest ein Detail wäre aber noch zu klären: Bei meinem Ansatz wird die nächste zu vergebende Laufnummer aufgrund der im Ordner bereits vorhandenen nummerierten Dateien ermittelt. Falls diese nun alle verschoben worden sein sollten, würde wieder bei "0001" (die Anzahl der Nullen/Stellen kannst Du selbst wählen) begonnen - daher nochmals die Bitte um eine Erläuterung des weiteren Ablaufs (nach dem Umbenennen) ...
Sollten tatsächlich regelmäßig alle nummerierten Dateien aus dem Ordner entfern werden, könnte ergänzend die jeweils höchste bereits verwendete Laufnummer in einer (.ini-) Datei hinterlegt und bei der Vergabe der nächsten Nummer berücksichtigt werden (oder gleich die bisher vorgesehene Ermittlung auf Basis der vorhandenen Dateien ersetzen).
[Edit] Ach ja: Gibt es im Ordner außer den "SCAN*.tif"-Dateien noch weitere Dateien? Wenn ja, nach welchen Konventionen sind diese benannt? (In der aktuellen Scriptfassung werden nämlich die umbenannten Dateien nur sehr oberflächlich anhand des enthaltenen "_" identifiziert - hier werde ich auf jeden Fall noch nachbessern.) [/Edit]
Grüße
bastla
Hallo highpriest!
Wie versprochen eine robustere Version:
Die hier zusätzlich verwendete ".ini"-Datei ist nur eine ganz gewöhnliche Textdatei, in welcher die zuletzt verwendete Nummer zwischengespeichert wird.
Grüße
bastla
Wie versprochen eine robustere Version:
Const Folder = "C:\Dokumente"
Const iniName = "High.ini"
ini = Folder & "\" & iniName
OldName = UCase("PRINT.") 'zur Erkennung der Originaldateien
Const NewName = "PRINT"
Const NewExtension = ".tif"
Const Digits = 4 'Stellenanzahl der laufenden Nummer
Set RegEx = New RegExp
RegEx.Pattern = "^" & NewName & "\d{8}_\d{" & CStr(Digits) & "}" & NewExtension & "$" 'Dateimuster: PRINT########_####.tif
Const adVarChar = 200
Set DataList = CreateObject("ADOR.Recordset")
DataList.Fields.Append "FileName", adVarChar, 255
DataList.Fields.Append "FileDate", adVarChar, 20
DataList.Open
OldNameLen = Len(OldName)
MaxNo = String(Digits, "0")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Folder).Files
FN = File.Name
If UCase(Left(FN, OldNameLen)) = OldName Then
DataList.AddNew
DataList("FileName") = FN
FileDate = CStr(File.DateLastModified)
DataList("FileDate") = Mid(FileDate, 7, 4) & Mid(FileDate, 4, 2) & Mid(FileDate, 1, 2) & Mid(FileDate, 11) 'JJJJMMTT hh:mm:ss
DataList.Update
ElseIf RegEx.Test(FN) Then
P1 = InStrRev(FN, "_") + 1
P2 = InStrRev(FN, ".")
If P2 > P1 Then
CurrNo = Mid(FN, P1, P2 - P1)
If Len(CurrNo) = Digits Then If CurrNo > MaxNo Then MaxNo = CurrNo
End If
End If
Next
MaxNoVal = CLng(MaxNo)
If fso.FileExists(ini) Then
HighNo = CLng(fso.OpenTextFile(ini).ReadLine)
If HighNo > MaxNoVal Then MaxNoVal = HighNo
End If
No = MaxNoVal + 1
If Not DataList.EOF Then
DataList.Sort = "FileDate"
DataList.MoveFirst
Do Until DataList.EOF
File = Folder & "\" & DataList.Fields.Item("FileName")
NewDate = Left(DataList.Fields.Item("FileDate"), 8)
NewNo = Right(String(Digits, "0") & CStr(No), Digits)
fso.GetFile(File).Name = NewName & NewDate & "_" & NewNo & NewExtension
fso.CreateTextFile(ini, True).Write CStr(No)
No = No + 1
DataList.MoveNext
Loop
End If
Grüße
bastla
Hallo highpriest!
Sollte dann etwa so aussehen:
Grüße
bastla
Sollte dann etwa so aussehen:
Const Folder = "C:\Dokumente"
Const iniName = "High.ini"
ini = Folder & "\" & iniName
OldName = UCase("PRINT.") 'zur Erkennung der Originaldateien
ToIgnore = UCase("PRINT.LOG")
Const NewName = "PRINT"
Const NewExtension = ".tif"
Const Digits = 4 'Stellenanzahl der laufenden Nummer
Set RegEx = New RegExp
RegEx.Pattern = "^" & NewName & "\d{8}_\d{" & CStr(Digits) & "}" & NewExtension & "$" 'Dateimuster: PRINT########_####.tif
Const adVarChar = 200
Set DataList = CreateObject("ADOR.Recordset")
DataList.Fields.Append "FileName", adVarChar, 255
DataList.Fields.Append "FileDate", adVarChar, 20
DataList.Open
OldNameLen = Len(OldName)
MaxNo = String(Digits, "0")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Folder).Files
FN = File.Name
If UCase(FN) <> ToIgnore Then
If UCase(Left(FN, OldNameLen)) = OldName Then
DataList.AddNew
DataList("FileName") = FN
FileDate = CStr(File.DateLastModified)
DataList("FileDate") = Mid(FileDate, 7, 4) & Mid(FileDate, 4, 2) & Mid(FileDate, 1, 2) & Mid(FileDate, 11) 'JJJJMMTT hh:mm:ss
DataList.Update
ElseIf RegEx.Test(FN) Then
P1 = InStrRev(FN, "_") + 1
P2 = InStrRev(FN, ".")
If P2 > P1 Then
CurrNo = Mid(FN, P1, P2 - P1)
If Len(CurrNo) = Digits Then If CurrNo > MaxNo Then MaxNo = CurrNo
End If
End If
End If
Next
MaxNoVal = CLng(MaxNo)
If fso.FileExists(ini) Then
HighNo = CLng(fso.OpenTextFile(ini).ReadLine)
If HighNo > MaxNoVal Then MaxNoVal = HighNo
End If
No = MaxNoVal + 1
If Not DataList.EOF Then
DataList.Sort = "FileDate"
DataList.MoveFirst
Do Until DataList.EOF
File = Folder & "\" & DataList.Fields.Item("FileName")
NewDate = Left(DataList.Fields.Item("FileDate"), 8)
NewNo = Right(String(Digits, "0") & CStr(No), Digits)
fso.GetFile(File).Name = NewName & NewDate & "_" & NewNo & NewExtension
fso.CreateTextFile(ini, True).Write CStr(No)
No = No + 1
DataList.MoveNext
Loop
End If
Grüße
bastla
hi, ich kenne mich ein wenig mit Batch-Dateien aus, aber gar nicht mit VBS. Aber etwas ganz ähnliches, jedoch mit relativem Pfad ermöglichen. Ich möchte aber mit VBS eine Datei temporär umbenennen ohne Pfadangabe. Also relativ zur vbs-Datei.
Ordner\Umbenenn.vbs
Odrner\Datei.txt
Wenn ich die Umbenenn.vbs starte, soll wenn die Datei.txt vorhanden ist, diese in Datei.sic umbenannt werden. 2 Bedingungen sollten gelten:
1. Wenn die Datei.txt nicht vorhanden ist, soll nichts gemacht werden
2. Wenn die Datei.sic schon vorhanden ist, braucht auch nix gemacht zu werden
In einer 2. VBS(Rueck.vbs) soll dann quasie das Gegenteil geschehen, aber nur fast:
Wenn die Datei.sic vorhanden ist, soll sie in Datei.txt umbenannt werden. 1 Bedingung soll gelten:
1. wenn die Datei.txt bereits vorhanden ist, soll die Datei.sic gelöscht werden
Man sieht doch dann kein Fenster mit Informationen, ob das geschen ist oder nicht? Das soll nämlich auch nicht sein, sondern alles unsichtbar ohne Nachfragen ablaufen ohne zu stören.
geht das auch?
Ordner\Umbenenn.vbs
Odrner\Datei.txt
Wenn ich die Umbenenn.vbs starte, soll wenn die Datei.txt vorhanden ist, diese in Datei.sic umbenannt werden. 2 Bedingungen sollten gelten:
1. Wenn die Datei.txt nicht vorhanden ist, soll nichts gemacht werden
2. Wenn die Datei.sic schon vorhanden ist, braucht auch nix gemacht zu werden
In einer 2. VBS(Rueck.vbs) soll dann quasie das Gegenteil geschehen, aber nur fast:
Wenn die Datei.sic vorhanden ist, soll sie in Datei.txt umbenannt werden. 1 Bedingung soll gelten:
1. wenn die Datei.txt bereits vorhanden ist, soll die Datei.sic gelöscht werden
Man sieht doch dann kein Fenster mit Informationen, ob das geschen ist oder nicht? Das soll nämlich auch nicht sein, sondern alles unsichtbar ohne Nachfragen ablaufen ohne zu stören.
geht das auch?
Hallo Julia,
bitte mach einen neuen Beitrag für deine Frage auf. Alte Themen auszugraben ist bei uns nicht gern gesehen.
Gruß,
Dani
bitte mach einen neuen Beitrag für deine Frage auf. Alte Themen auszugraben ist bei uns nicht gern gesehen.
Gruß,
Dani