highpriest
Goto Top

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:

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. face-smile

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

Content-Key: 87823

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

Ausgedruckt am: 28.03.2024 um 20:03 Uhr

Mitglied: SarekHL
SarekHL 16.05.2008 um 22:44:11 Uhr
Goto Top
Mit VB Script kenne ich mich nicht aus, aber wenn sonst niemand hier eine Idee hat, kann ich Dir mal was in VB schreiben ... eine ähnliche Geschichte habe ich mir selber mal programmiert, das müßte nur leicht angepaßt werden ...
Mitglied: highpriest
highpriest 16.05.2008 um 23:56:32 Uhr
Goto Top
Für jeden Vorschlag wäre ich natürlich sehr dankbar!
Ich weiß zwar nicht was der Unterschied zw. VB Script und VB ist, aber wenn es mein Problem löst
würde ich mich freuen.
Mitglied: tacker
tacker 17.05.2008 um 00:02:37 Uhr
Goto Top
abend

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 sollface-smile 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
Mitglied: highpriest
highpriest 17.05.2008 um 01:19:25 Uhr
Goto Top
@ tacker
wow, das ging ja richtig schnell!
Ich kann es leider erst am Montag testen (kann nicht mehr erwarten face-smile )
Ich werde abends dann berichten.
Ich danke dir jetzt schon mal für deine Mühe!!!

nur eine frage, was is wenn der zähler über die dreistellige zahl hinausläuft?

Das wird nicht passieren, da nach dem Import ins Archivsystem wird der Verzeichnis automatisch entleert. Der Import wird min. alle 2 Tage laufen und so viele Belege werden in dieser Zeit nicht erstellt.
Mitglied: bastla
bastla 17.05.2008 um 01:39:15 Uhr
Goto Top
Hallo highpriest und willkommen im Forum!

... dieses Flackern wird bestimmt meinen Mitarbetern nicht gefallen. face-smile
Würden sie lieber den Status Quo behalten? face-wink

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
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
Mitglied: highpriest
highpriest 17.05.2008 um 19:15:50 Uhr
Goto Top
Hallo, bastla!
Ich danke Dir für deine Arbeit, ich bin begeistert!!!
Der folgende Entwurf erzeugt, abweichend von Deiner Vorgabe, Dateinamen nach folgendem Schema: "PRINT20080517_0001.tif" - damit lassen sich die Dateien vor allem leichter sortieren.
Super Vorschlag, so weit habe ich noch nicht gedacht. Die Sortierung ist nämlich sehr wichtig und zwar in der Reihenfolge, wie es gedruckt wird.
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.
Genial.
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.
Super! Du hast wirklich an alles gedacht, solche Fälle könnten wirklich auftretten. Und wie ich schon sagte, die sortierung ist sehr wichtig!
Nur eine Sache habe ich am Anfang vergessen. Im Ordner liegen auch noch die gescannte Beläge, die heißen z. B. SCAN0510.tif SCAN0511.tif SCAN0512.tif usw.. Was passiert mit dennen, werden sie auch als PRINT......tif umbenannt oder nicht. Nach Möglichkeit sollen sie in dem gleichen Ordner landen und unverädert bleiben.
Ist das Möglich oder ist das zu viel verlangt?
Gruß
highpriest
Mitglied: tacker
tacker 17.05.2008 um 20:37:10 Uhr
Goto Top
salü!

deine letzte frage braucht dich nicht zu beunruhigen! in bastla's sowie in meinem vorschlag wird dies gecheckt! bei mir rührt er files it der endung .tif nicht an, bei bastla werden nur files mit dem anfang "PRINT." berücksichtigt!

gruss tacker
Mitglied: highpriest
highpriest 17.05.2008 um 21:47:14 Uhr
Goto Top
Ich danke Euch beiden!!!
Dann kann es nichts mehr schief gehen. face-smile
Ihr habt nicht nur das gelöst, was ich mir vorgestellt habe, sondern auch ein Stück weitergedacht!
Ich kann nicht mehr erwarten es am Montag zu testen!
Ich berichte meine Ergebnise später.
Viele Grüße!
highpriest
Mitglied: bastla
bastla 17.05.2008 um 23:15:05 Uhr
Goto Top
Hallo highpriest!

Dann kann es nichts mehr schief gehen. face-smile
Hoffen wir mal das Beste ... face-wink

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
Mitglied: bastla
bastla 18.05.2008 um 10:55:09 Uhr
Goto Top
Hallo highpriest!

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
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
Mitglied: highpriest
highpriest 18.05.2008 um 20:03:55 Uhr
Goto Top
Hallo, bastla!

Ach ja: Gibt es im Ordner außer den "SCAN*.tif"-Dateien noch weitere Dateien?

Im Ordner liegen nur die zwei Dateitypen, also SCAN*.tif und die PRINT.***

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)

Nach dem Umbenennen werden die Dateien ins Archivsystem importiert und aus dem Ordner wieder gelöscht. Ich kann nocht nicht sagen, ob die tif's nach dem Import im Archiv noch mal umbenannt werden und wenn ja nach welchem Muster (das muß ich noch prüfen). Jede gescannte, gedruckte tif-Datei wird verschlagwortet und bekommt im Archiv einen Bezug auf die Datei. Wenn die Dateien unverändert bleiben, darf der Dateiname natürlich nicht noch mal wiederholen. Deshalb denke ich, das mit INI-Datei ist die sicherste Variante. Wie gesagt, das alles muß ich morgen prüfen und dann testen.
Ich danke Dir sehr für deine Mühe!
Der Montag kann beginnen! face-smile
Gruß!
highpriest
Mitglied: highpriest
highpriest 19.05.2008 um 12:04:10 Uhr
Goto Top
Hallo, bastla!
Der Script mit INI-Datei läuft sehr gut.
Ich habe aber heute festgestellt, dass der TIF-Drucker im Verzeichnis eine LOG-Datei "PRINT.LOG" ersellt, die ich nicht deaktivieren kann. Der Script umbenennt die LOG natürlich auch mit. Kannst du noch die Abfrage einbauen, dass die "PRINT.LOG" nicht umbenannt wird? Ich kriege es nicht hin. face-sad
Danke im Voraus!
highpriest
Mitglied: bastla
bastla 19.05.2008 um 12:53:20 Uhr
Goto Top
Hallo highpriest!

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
Mitglied: highpriest
highpriest 19.05.2008 um 13:40:19 Uhr
Goto Top
Hallo, bastla!
Ich Danke Dir für die schnelle Reaktion!
Klasse Arbeit von Dir, jetz läuft alles wie geplannt!
Du hast mich gerade glücklich gemacht!!! face-smile face-smile face-smile
Vielen Dank!
Gruß
highpriest
Mitglied: o0Julia0o
o0Julia0o 14.02.2015 um 19:27:35 Uhr
Goto Top
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?
Mitglied: Dani
Dani 14.02.2015 um 19:48:09 Uhr
Goto Top
Hallo Julia,
bitte mach einen neuen Beitrag für deine Frage auf. Alte Themen auszugraben ist bei uns nicht gern gesehen.


Gruß,
Dani