thomas2010
Goto Top

Challenge mit einem Batch beim Umbennen von Files mit einem Punkt im Namen gesucht

Hallo Alle,

ich habe eine Challenge mit dem Umbennen von Dateien mit einem Batch File
(Es sind sehr viele Files und deswegen will ich das automatisieren).

Ich würde gerne alle '.' im File Namen (Z.B. eins.zwei.drei.txt)
in '-' (eins-zwei-drei.txt) umbennen.

Ich habe mir die Beispiele von den anderen Umbenennen Fragen angesehen aber ich
bekomms leider nur hin das alle und damit leider auch
das letzte '.' im Beispiel '.txt' (File Endung) umbenannt werden.

Kann mir irgend jemand Bitte helfen oder einen Tipp geben wie man das richtig mit
einem Batch macht und das letzte '.' im File Namen beim umbenennen bestehen bleibt?

Grüße
Thomas
Kommentar vom Moderator Biber am Feb 02, 2010 um 18:34:16 Uhr
Challenge mit einem Batch beim Umbennen...
#rgc = 643
ich habe eine Challenge mit dem Umbennen von Dateien mit einem Batch File
#rgc = 644
Ich würde gerne alle '.' im File Namen (Z.B. eins.zwei.drei.txt) in '-' (eins-zwei-drei.txt) umbennen.
#rgc =645
Ein "Umbennen" hatten wir schon oft, aber noch nie so viele im Zusammenhang mit der Challenger...
Muss ein Mehr-Sitzer sein...

Content-Key: 134999

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

Printed on: April 19, 2024 at 20:04 o'clock

Member: dog
dog Feb 02, 2010 at 18:09:36 (UTC)
Goto Top
Ungetestet mit VBS etwa so:
Dim file, name,first, newName

Set filesys = CreateObject("Scripting.FileSystemObject")  
Set folder  = filesys.GetFolder("C:\Ordner")  
Set files   = folder.Files

For Each file in files
	name = StrReverse(file.Name)
	first = InStr(name,".")  
	newName = Replace(name,"-",".",(first+1))  
	file.Name = StrReverse(newName)
Next
Member: miniversum
miniversum Feb 02, 2010 at 18:15:48 (UTC)
Goto Top
Ungstestete version:
@echo off
FOR /F "delims=" %%i in ('dir /b "C.\dateien\*.*"') do call:umbenennen "%~ni" "%~xi"  
goto:eof

:umbenennen
set "name=%~1"  
ren "C.\dateien\%~1%~2" "%name:.=-%%~2"  
Mitglied: 76109
76109 Feb 02, 2010 at 21:20:54 (UTC)
Goto Top
Hallo Dog!

Dein Skript wird nicht funktionieren. Die Dateierweiterung geht verloren und bei Replace ist die Reihenfolge vertauscht ("-", "." anstatt ".", "-")

Alternativ sollte das gehen (*.vbs):
Const Path = "C:\Ordner"  

Dim Folder, File, oldName, newName

Set Folder = CreateObject("Scripting.FileSystemObject").GetFolder(Path)  

For Each File In Folder.Files
    oldName = Split(StrReverse(File.Name), ".", 2)  
    newName = Replace(StrReverse(oldName(1)), ".", "-") & "." & StrReverse(oldName(0))  
    If File.Name <> newName Then File.Name = newName
Next

Gruß Dieter
Member: dog
dog Feb 02, 2010 at 21:29:36 (UTC)
Goto Top
Ja, ich habe beim Beitrag nicht richtig aufgepasst face-wink
Mitglied: 76109
76109 Feb 02, 2010 at 21:33:56 (UTC)
Goto Top
Hallo Dog!

Das passiert mir ab und zu auchface-smile

Gruß Dieter
Member: edepfau
edepfau Feb 03, 2010 at 08:43:22 (UTC)
Goto Top
getestete Version:
cd /d "C:\Ordner"  
FOR /R %%i in ("*.*") do call :umbenennen "%%~pi" "%%~ni" "%%~xi"  
goto :EOF

:umbenennen 
REM path name_only ext
set "name=%~2"   
ren "%~1%~2%~3" "%~1%name:.=-%%~3"  

Unterschied: der voll Pfad wird mitgenommen, die Verzeichnisse werden rekursiv durchlaufen.

Gruss,
Ede
Member: Biber
Biber Feb 03, 2010 at 10:01:54 (UTC)
Goto Top
Moin edepfau,


Zitat von @edepfau:
getestete Version:
Mag sein... aber wenn das Ergebnis des Test doch so war wie es aufgrund des Codes sein muss...
Dann solltest du besser ein paar Smilies dahintersetzen.... sonst benutzt noch irgendjemand den Schnipsel.

Andererseits...
.. es gab auch mal eine Zahnpasta, die sich verkauft hat wie blöd... auch nur wegen des Slogans "Klinisch getestet".
Und die hatten auch nie das Ergebnis des Tests mit angegeben. face-wink

> cd /d "C:\Ordner"  
> FOR /R %%i in ("*.*") do call :umbenennen "%%~pi" "%%~ni" "%%~xi"  
> goto :EOF
> 
> :umbenennen 
> REM path name_only ext
> set "name=%~2"   
> ren "%~1%~2%~3" "%~1%name:.=-%%~3"  
> 

Unterschied: der voll Pfad wird mitgenommen, die Verzeichnisse werden rekursiv durchlaufen.

Gruss,
Ede

Kann aus zwei Gründen zwar keinen Schaden anrichten, aber auch nie funktionieren

  • Wenn beim Umbenennen "alterName"=="neuerName" ist, dann geht natürlich ein "REN alterName neuerName" in die Grütze.

  • selbst wenn Dateien gefunden worden wären mit "neuerName ist anders als alterName", also mit zu ersetzendem Punkt im Dateinamen, dann wäre der REN-Befehl daran gescheitert, dass bei Alt- UND bei Neu-Datei jeweils der Pfad mit angegeben ist. Das darf nicht.

Neuer Versuch (Prädikat "getestet und für ausbaufähig befunden")
@echo off & setlocal
FOR /R "D:\Biber" %%i in ("*.*") do call :umbenennen "%%~fi"  
goto :EOF

:umbenennen 
:: den Namen (ohne Ext) in eine Variable speichern zum Suchen/ersetzen
Set "name=%~n1"   
:: Punkt durch Minus ersetzen
Set "Name=%name:.=-%"  
:: Wenn kein Punkt im Namen war bzw. NameVorher gleich NameNachher.ZURÜCK
If "%name%"=="%~n1" goto :eof  
:: sonst : Umbenamsen HIER NUR ANGEDEUTET mit ECHO
Echo ren "%~1" "%name%%~x1"  

Ergebnis/Ausgabe eines Aufrufs der Batchdatei "edeV.cmd"
>z:\austausch\edev.cmd
ren "D:\Biber\downloads\KDiff3Setup_0.9.95.exe" "KDiff3Setup_0-9-95.exe"
ren "D:\Biber\downloads\seamonkey-1.1.16.de-AT.win32.zip" "seamonkey-1-1-16-de-AT-win32.zip"

Von allen Dateien in der Teilstruktur "D.\Biber" haben einzig die beiden angezeigten Dateien einen/mehrere Punkte im Namen.
Und für die wird angezeigte REN-Anweisung generiert

Grüße
Biber
Member: edepfau
edepfau Feb 03, 2010 at 12:17:53 (UTC)
Goto Top
Sehr guter Hinweis auf die Syntax von ren. Der Pfad darf beim Ersatznamen nicht angegeben werden.
Auch die Aufnahme des Anfangspfads in die "for"-Schleife ist gut, sehr kompakt. Kannte ich nicht.

Der andere Einwand, dass ren "abc" "abc" zu einem Fehler führt, stimmt zumindest bei mir nicht (W2K, cmd-Fenster). Vielleicht aber unter DOS.
Ohne IF-Abfrage und doppelte Ersetzungen spart man eine Menge Zeit, wenn es um Tausende von Ordnern geht.

@echo off & setlocal enableextensions                
FOR /R "C:\Ordner" %%i in ("*.*") do call :umbenennen "%%~pi" "%%~ni" "%%~xi"  
goto :EOF

:umbenennen 
REM path name_only ext
set "name=%~2"   
ren "%~1%~2%~3" "%name:.=-%%~3" || echo FEHLER bei "%~1%~2%~3"  

Gruss,

Ede
Member: Biber
Biber Feb 03, 2010 at 13:17:18 (UTC)
Goto Top
Moin edepfau,

Hier hast du recht...
Der andere Einwand, dass ren "abc" "abc" zu einem Fehler führt, stimmt zumindest bei mir nicht (W2K, cmd-Fenster). Vielleicht aber unter DOS.

Das habe ich nicht überprüft (sondern nur den oft gelesenen Fehlertext "Datei nicht gefunden oder doppelter Dateiname" im Hinterkopf bzw. unterstellt).

In der Tat ist es aber so, dass der Versuch einer Datei-Umbenamsung auf den bereits vorhanden Namen nicht als "Fehler" gewertet wird
Beispiel:
>echo xx>test23.txt
>ren test23.txt test23.txt ||echo fehler
{... echoes nothing..}

Und noch redmondiger - nicht nur, dass kein Fehler gemeldet wird... er macht es auch tatsächlich..
Eine Variation
ren test23.txt Test23.txt
hinterlässt wirklich eine "Test23.txt"-Datei mit einem gross geschriebenen "T" ...

So wie die Mädels möchte ich auch programmieren können...

Grüße
Biber
Member: thomas2010
thomas2010 Feb 04, 2010 at 17:11:48 (UTC)
Goto Top
Hallo Biber,

erstmal Danke für die gute wirklich interessante Lösung.
Auch Danke an die anderen der Diskussion.
Wieder einiges dazu gelernt!

Eine kleine Sache ist mir aber noch nicht ganz klar.

:: Punkt durch Underline ersetzen
set "name=%name:.=_%"
xxxx

Das ':' steht für ersetzen?
Wo sind solche Sachen eigenlich dokumentiert?
Ich habe im Netz mal gesucht habe aber zu dem speziellen set nichts gefunden.

Gruß
Thomas
Member: miniversum
miniversum Feb 04, 2010 at 17:33:23 (UTC)
Goto Top
starte die cmd und gib dort
set /?
ein. Da steht das.
Funktioniert auch bei anderen Befehlen ;)
Member: Biber
Biber Feb 04, 2010 at 17:37:48 (UTC)
Goto Top
Moin thomas2010,

zu deinen Rest/Folgefragen
Das ':' steht für ersetzen?
Jein.... siehe unten.

Wo sind solche Sachen eigenlich dokumentiert?

Das wirst du jetzt gar nicht glauben, ist aber ernst gemeint:
Am heimischen Rechner in einem geöffneten CMD-Fenster.
Da gibt es zu jedem internen/externen mitgelieferten Kommandozeilen-Befehl eine Hilfe durch einfachen Aufruf von "DerBefehl /?"

Und die ist eigentlich gar nicht schlecht und verglichen mit dem Internet regelrecht werbefrei.
Beispiel am CMD-Prompt wäre die Hilfe zum Befehl SET, wo ja vielleicht nicht nur etwas zum SETzen von Variablen steht, sondern auch etwas zur UmSETzung..

> SET /?
.....
....
Das Ersetzen von Umgebungsvariablen wurde folgendermaßen erweitert:

    %PATH:str1=str2%

Dies erweitert die PATH-Umgebungsvariable, wobei jede Instanz von "str1" im
erweiterten Ergebnis mit "str2" ersetzt wird. "str2" kann die leere
Zeichenfolge sein, um alle Instanzen von "str1" aus der erweiterten Ausgabe zu
löschen. Wenn "str1" mit einem Sternchen beginnt, steht "str1" für alles
zwischen dem Anfang der erweiterten Ausgabe bis zum ersten Auftreten des
übrigen Abschnitts von "str1".
.....
....

Ich habe im Netz mal gesucht habe aber zu dem speziellen set nichts gefunden.
Irgendwo zwischen den Extremen "ganz triste Hilfe zu CMD-Befehlen auf einem bernsteinfarbenen 25x80 Monitor" und "quietschbunte Kiddiesprechblasen im Netz" könntest du ja mal die Suchfunktion auf dieser Seite ausprobieren (oben rechts zu sehen).

Zu Batch- und Skripting-Themen haben wir schon ein oder zwei Antworten hier geben können, die so insgesamt als ganz brauchbar beurteilt wurden.

Grüße
Biber