Dateinamen kürzen
Hallo Leute,
ich habe zwar viele Beiträge zum Thema umbenennen von Dateien gefunden, aber keiner der Beiträge konnte mir wirklich bei meinem Problem weiterhelfen, deshalb fange ich einen neuen Beitrag an.
Das Problem ist folgenden:
Ich erhalte Dateien mit einer fortlaufenden Nummer. Diese Nummer soll gestrichen werden, sofern noch keine Datei ohne die Nummer besteht.
Es soll also die Datei xyz_12345.abc in xyz.abc umbenannt werden.
Sobald die Datei xyz.abc verschoben wurde soll die Datei xyz_12346.abc in xyz.abc umbenannt werden usw.
Zeitgleich soll es auch möglich sein die Datei xzy_12348.abc in xzy.abc umzubenennen, da diese Datei nicht die Datei xzz.abc überschreiben würde.
Die Nummern müssen nicht zwangsweise ansteigend sein, d.h. es kann vorkommen das die Dateien 00002.....010000 bereits umbenannt wurden und erst später die Datei 000001 in den Ornder geschoben wird.
Die Dateinamen sind leider nicht bekannt, xyz steht also für eine beliebige Dateibezeichnung. Die Dateiendung .abc ist hingegegen ständig die gleiche.
Hat jemand eine Lösung für dieses Problem?
ich habe zwar viele Beiträge zum Thema umbenennen von Dateien gefunden, aber keiner der Beiträge konnte mir wirklich bei meinem Problem weiterhelfen, deshalb fange ich einen neuen Beitrag an.
Das Problem ist folgenden:
Ich erhalte Dateien mit einer fortlaufenden Nummer. Diese Nummer soll gestrichen werden, sofern noch keine Datei ohne die Nummer besteht.
Es soll also die Datei xyz_12345.abc in xyz.abc umbenannt werden.
Sobald die Datei xyz.abc verschoben wurde soll die Datei xyz_12346.abc in xyz.abc umbenannt werden usw.
Zeitgleich soll es auch möglich sein die Datei xzy_12348.abc in xzy.abc umzubenennen, da diese Datei nicht die Datei xzz.abc überschreiben würde.
Die Nummern müssen nicht zwangsweise ansteigend sein, d.h. es kann vorkommen das die Dateien 00002.....010000 bereits umbenannt wurden und erst später die Datei 000001 in den Ornder geschoben wird.
Die Dateinamen sind leider nicht bekannt, xyz steht also für eine beliebige Dateibezeichnung. Die Dateiendung .abc ist hingegegen ständig die gleiche.
Hat jemand eine Lösung für dieses Problem?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 31306
Url: https://administrator.de/contentid/31306
Ausgedruckt am: 22.11.2024 um 13:11 Uhr
6 Kommentare
Neuester Kommentar
Hi,
Deine Beschreibung ist noch nicht ganz klar.
Im zweiten Satz schreibst, Du Nummer soll gestrichen werden, wenn es noch keine Datei mit diesem Namen gibt.
Was soll passieren, wenn es diesen Namen schon gibt, soll die Nummer erhalten bleiben?
Aber das ist doch alles kein Problem.
Nach Deiner Beschreibung gibt es im Dateinamen einen Unterstrich, auf Basis dieses Striches kann man Name und Nummer trennen (mit vorheriger Prüfung, dass der Name noch frei ist).
Anschließend wird die Datei verschoben und mit der nächsten Datei weitergemacht.
Während das Script läuft, würde ich keine Dateien per Hand entfernen.
Das ganze dauert je nach Anzahl der Dateien nur wenige Sekunden.
Entweder stößt Du dann das Script immer mal wieder per Hand an oder läßt es als Endlosschleife laufen.
Bei Fragen zum Script einfach melden.
Grüße
Guido
Deine Beschreibung ist noch nicht ganz klar.
Im zweiten Satz schreibst, Du Nummer soll gestrichen werden, wenn es noch keine Datei mit diesem Namen gibt.
Was soll passieren, wenn es diesen Namen schon gibt, soll die Nummer erhalten bleiben?
Aber das ist doch alles kein Problem.
Nach Deiner Beschreibung gibt es im Dateinamen einen Unterstrich, auf Basis dieses Striches kann man Name und Nummer trennen (mit vorheriger Prüfung, dass der Name noch frei ist).
Anschließend wird die Datei verschoben und mit der nächsten Datei weitergemacht.
Während das Script läuft, würde ich keine Dateien per Hand entfernen.
Das ganze dauert je nach Anzahl der Dateien nur wenige Sekunden.
Entweder stößt Du dann das Script immer mal wieder per Hand an oder läßt es als Endlosschleife laufen.
Bei Fragen zum Script einfach melden.
Grüße
Guido
'Dateinamen verändern und Dateien verschieben'
'27.04.06/ge'
const C_Quelle = "c:\temp"
const C_Ziel = "c:\Log"
const C_Log = "c:\Log\rename.log"
const C_Erw = "txt"
DIM O_FSO
DIM O_Log
Set O_FSO = CreateObject("Scripting.FileSystemObject")
if Not O_FSO.FolderExists("c:\Log") then
O_FSO.CreateFolder("c:\Log")
end if
Set O_Log = O_FSO.OpenTextFile(C_Log,2,true)
call S_CheckFile
'################'
'Dateien einlesen'
sub S_CheckFile
on error resume next
DIM O_Dir
DIM O_Datei
DIM O_Move
DIM L_Split
DIM L_DateiNeu
DIM L_DateiAlt
DIM L_MoveQuelle
DIM L_MoveZiel
set O_Dir = O_FSO.GetFolder(C_Quelle)
for each O_Datei in O_Dir.files
if instr(O_Datei.Name,"_") > 0 then
L_Split = Split(O_Datei.Name,"_")
L_DateiNeu = C_Ziel & "\" & L_Split(0) & "." & C_Erw
if O_FSO.FileExists(L_DateiNeu) then
O_Log.writeline "ACHTUNG: Die Datei " & O_Datei.Name & " kann nicht umbenannt werden, da die Datei " & L_Split(0) & "." & C_Erw & " im Ziel existiert!"
O_Log.writeline ""
elseif O_FSO.FileExists(C_Quelle & "\" & L_Split(0) & "." & C_Erw) then
O_Log.writeline "ACHTUNG: Die Datei " & O_Datei.Name & " kann nicht umbenannt werden, da die Datei " & L_Split(0) & "." & C_Erw & " in der Quelle existiert!"
O_Log.writeline ""
else
L_DateiAlt = O_Datei.Name
O_Datei.Name = L_Split(0) & "." & C_Erw
if err.number <> 0 then
O_Log.writeline "FEHLER beim umbenennen von: " & C_Quelle & "\" & L_DateiAlt
O_Log.writeline " " & err.description
else
O_Log.writeline L_DateiAlt & "' umbenannt in '" & L_Split(0) & "." & C_Erw & "'"
L_MoveQuelle = C_Quelle & "\" & L_Split(0) & "." & C_Erw
L_MoveZiel = C_Ziel & "\"
Set O_Move = O_FSO.GetFile(L_MoveQuelle)
O_FSO.moveFile L_MoveQuelle, L_MoveZiel
if err.number <> 0 then
O_Log.writeline " FEHLER beim verschieben"
O_Log.writeline " " & err.description
else
O_Log.writeline " " & L_Split(0) & "." & C_Erw & " verschoben nach " & C_Ziel
end if
set O_Move = nothing
end if
O_Log.writeline ""
end if
end if
next
on error goto 0
end sub
Hi,
schicke mir einfach eine PN mit Deiner Mail-Adresse, dann schicke ich Dir den Code noch mal per Mail, damit die Einrückungen erhalten bleiben.
Bei den Konstanten gibst Du Quelle und Ziel an, sowie die Dateierweiterung.
Im Quell-Ordner werden alle Dateien mit einem Unterstrich herausgepickt.
Danach wird geguckt, ob der gekürtze Namen im Quellverzeichnis oder im Zielverzeichnis existiert.
Wenn nicht, wird die Datei im Quellverzeichnis umbenannt und anschließend kopiert.
Mit jedem Lauf wird eine neues Logfile in c:\Log angelegt, das sämtliche Aktionen protokolliert.
Kopiere am Besten den Ordner mit den Dateien woanders hin und mache mal ein paar Testläufe, wenn Du damit zufrieden bist, kannst Du Dir immer noch überlegen, ob das mit einer Endlosschleife verbunden wird, oder ob Du das Script lieber z. B. alle paar Stunden einmal ausführst.
Grüße
Guido
www.code-master.de
schicke mir einfach eine PN mit Deiner Mail-Adresse, dann schicke ich Dir den Code noch mal per Mail, damit die Einrückungen erhalten bleiben.
Bei den Konstanten gibst Du Quelle und Ziel an, sowie die Dateierweiterung.
Im Quell-Ordner werden alle Dateien mit einem Unterstrich herausgepickt.
Danach wird geguckt, ob der gekürtze Namen im Quellverzeichnis oder im Zielverzeichnis existiert.
Wenn nicht, wird die Datei im Quellverzeichnis umbenannt und anschließend kopiert.
Mit jedem Lauf wird eine neues Logfile in c:\Log angelegt, das sämtliche Aktionen protokolliert.
Kopiere am Besten den Ordner mit den Dateien woanders hin und mache mal ein paar Testläufe, wenn Du damit zufrieden bist, kannst Du Dir immer noch überlegen, ob das mit einer Endlosschleife verbunden wird, oder ob Du das Script lieber z. B. alle paar Stunden einmal ausführst.
Grüße
Guido
www.code-master.de
Moin Crazy,
als Batch wäre das (theoretisch) folgende Zeile:
Der Batch würde auch immer die "ältesten" Dateien zuerst umbenennen.
Zur Demo am CMD-Prompt:
Aber für sinnvoller würde ich schon eine Lösung ähnlich Guido's halten, d.h.
- lesbar und wartbar
- eventuell mit Logdatei - obwohl ich denke, die Info, wie diese Zwischendateien hießen, ist ohne jeglichen Informationsgehalt und von wann die sind, protokolliert sicherlich auch das die verarbeitende Programm.
- und, viel wichtiger, irgendwo noch ein kurzes "Warten" dazwischen sollte rein (im Batch mit TimeOut.exe oder Sleep.exe oder "ping localhost >nul" , in *.vbs mit einer kleiner Zählschleife o. ä.)
Denn sonst ist der Job (egal in welcher Skriptsprache) endlos nur am Verzeichnisinhalt einlesen.. und das macht M$ mit deren selbstgebastelter Ressourcenfreigabe und Speicherdefragmentierung nicht ewig mit. Sprich: der Batch stürzt nach zwei, drei Monaten ab, weil er alle Ressourcen verbraten hat und muss neu gestartet werden.
Ärgerlicher ist dann allerdings, dass alle anderen Prozesse auch keine Ressourcen mehr bekommen und stinkelangsam werden nach ein paar Wochen.
(Frag mal Lonesome Walker, der hat mal einen Batch rekursiv eine 2 GigaByte große Unterverzeichnisstruktur aufbauen lassen über Wochen)
Betrachte also meinen Oneliner eher als Gag - in Deinem Fall sollte schon ein Mehrzeiler (der zwischen der Umbenennerei auch mal Pause macht) die elegantere Lösung sein.
Grüße
Biber
als Batch wäre das (theoretisch) folgende Zeile:
::---snipp RenameIfPossible.bat
(@for /f "delims=_. tokens=1-3" %%i in ('dir /b /o:d *_*.abc') do @if not exist %%i.%%k @rename %%i_%%j.%%k %%i.%%k ) & %0
::--snapp
Zur Demo am CMD-Prompt:
(=21:35:19 D:\temp\crazy=)
>for /f "delims=_. tokens=1-3" %i in ('dir /b /o:d *_*.abc') do @if not exist %i.%k @echo rename %i_%j.%k %i.%k
rename xyz_12346.abc xyz.abc <---würde auflösen zu diesem Befehl links.
Aber für sinnvoller würde ich schon eine Lösung ähnlich Guido's halten, d.h.
- lesbar und wartbar
- eventuell mit Logdatei - obwohl ich denke, die Info, wie diese Zwischendateien hießen, ist ohne jeglichen Informationsgehalt und von wann die sind, protokolliert sicherlich auch das die verarbeitende Programm.
- und, viel wichtiger, irgendwo noch ein kurzes "Warten" dazwischen sollte rein (im Batch mit TimeOut.exe oder Sleep.exe oder "ping localhost >nul" , in *.vbs mit einer kleiner Zählschleife o. ä.)
Denn sonst ist der Job (egal in welcher Skriptsprache) endlos nur am Verzeichnisinhalt einlesen.. und das macht M$ mit deren selbstgebastelter Ressourcenfreigabe und Speicherdefragmentierung nicht ewig mit. Sprich: der Batch stürzt nach zwei, drei Monaten ab, weil er alle Ressourcen verbraten hat und muss neu gestartet werden.
Ärgerlicher ist dann allerdings, dass alle anderen Prozesse auch keine Ressourcen mehr bekommen und stinkelangsam werden nach ein paar Wochen.
(Frag mal Lonesome Walker, der hat mal einen Batch rekursiv eine 2 GigaByte große Unterverzeichnisstruktur aufbauen lassen über Wochen)
Betrachte also meinen Oneliner eher als Gag - in Deinem Fall sollte schon ein Mehrzeiler (der zwischen der Umbenennerei auch mal Pause macht) die elegantere Lösung sein.
Grüße
Biber