Problem
Es kommt oft vor, dass man eine grosse Anzahl von Datei umbenennen muss, etwa .jpg-Dateien. Man hat zum Beispiel ein paar hundert Dateien mit Namen wie
– Pentax017001.jpg
– Pentax017002.jpg
– Pentax017003.jpg
und möchte sie lieber so nennen
– Bali017001.jpg
– Bali017002.jpg
– Bali017003.jpg
Lösung
Für das genannte Problem gibt es natürlich mehr als nur eine Lösung. Ein interessantes Freeware-Programm, das diese und ähnliche Aufgaben löst, ist dieses:
http://www.1-4a.com/rename/.
In diesem Artikel stellen wir zwei Skriptlösungen vor, die das gezeigte Problem ebenfalls lösen können: Eine Batchdatei und ein Skript in Visual Basic Script (VBS). Auch wenn manche Werkzeuge noch mehr können, bieten unsere Skripts vielleicht Anregungen, ähnlich gelagerte Lösungen ausfzubauen.
Wenn man die Batch-Datei „NewName.bat“ oder das VBS-Skript im Ordner ablegt, wo sich die Dateien befinden, dann kann man mit einem Doppelklick in sämtliche Dateinamen die Zeichenfolgen „Pentax“ auf „Bali“ ändern. Wahlweise kann das Programm auch sämtliche Unterverzeichnisse bearbeiten. Um sicher zu sein, dass die Umbenennung auch stimmt, kann das Programm erst im Problauf betrieben werden.
Die Batch-Lösung
Beachte: Das Batchprogramm kann mit speziellen Zeichen wie % ^ & nicht umgehen und wird deshalb automatisch beendet. Enthalten manche Namen solche Zeichen, dann müssen sie erst von Hand umbenannt werden, oder das Programm „NewName.vbs“ muss verwendet werden.
Verwendung
Den Quelltext markieren, kopieren und dann in die Datei „NewName.bat“ einfügen. „NewName.bat“ muss im selben Verzeichnis abgelagert werden, wo sich die Dateien befinden, die umbenennt werden müssen.
Als nächstes den Quelltext anpassen. Dazu müssen die folgenden 5 Zeilen geändert werden:
set aktiv=nein (nein=bloss Probelauf, ja=Umbenennen)
set sub=ja (ja=Unterverzeichnisse bearbeiten, nein=Unterverzeichnisse nicht bearbeiten)
set typ=jpg (Dateityp. Z.B. jpg für Bilderdateien)
set alt=0000 (Ursprüngliche Zeichenfolge)
set neu=-2008 (Gewünschte Zeichenfolge)
Quelltext
@echo off goto Start ---------------------------------------------------------------- Dieses Programm wird alle Dateien im gegenwärtigen Verzeichnis umbenennen, indem die Zeichenfolge {alt} in den Dateinamen durch die Zeichenfolge {neu} ersetzt wird. Beispiel: set alt=0000 set neu=-2008 Die Datei 12340000.jpg wird auf 1234-2008.jpg umbenannt. Die Datei 9970000.jpg wird auf 976-2008.jpg umbenannt. Die folgende Einstellungen müssen weiter unten vorgenommen werden set aktiv=nein (nein=bloss Probelauf, ja=Umbenennen) set sub=ja (ja=Unterverzeichnisse bearbeiten, nein=Unterverzeichnisse nicht bearbeiten) set typ=jpg (Dateityp. Z.B. jpg für Bilderdateien) set alt=0000 (Ursprüngliche Zeichenfolge) set neu=-2008 (Gewünschte Zeichenfolge) Datein werden nicht umbenannt, falls eine gleichnamige Datei schon existiert. Falls Dateinamen existieren, welche die Zeichen %, ^ oder & enthalten, wird das Programm nicht ausgeführt. In solchen Fällen ist das entsprechende VB Script Programm zu benutzen. ------------------------------------------------------------------ :Start rem ----------------------------------------------------------- rem Du musst die nächsten 5 Zeilen deiner Umgebung anpassen! rem ----------------------------------------------------------- set aktiv=nein set sub=nein set typ=txt set alt=temp set neu=xyz rem ----------------------------------------------------------- rem Die Einstellungen "aktiv" und "sub" bearbeiten rem ----------------------------------------------------------- setlocal EnableDelayedExpansion if /i %aktiv%==ja (set cmd=if not) else (set cmd=rem) if /i %sub%==ja (set switch=/s) else (set switch=) rem ----------------------------------------------------------- rem Eine Liste aller Dateien aufstellen. Gibt es problematische Zeichen? rem ----------------------------------------------------------- dir /b /a-d %switch% *.%typ% > "%temp%\dir.txt" findstr "%% ^ &" "%temp%\dir.txt" > nul && goto Error rem ----------------------------------------------------------- rem Die Dateien umbenennen rem ----------------------------------------------------------- for /F "delims=" %%a in ('type "%temp%\dir.txt"') do ( set Name1=%%a call set Name2=!Name1:%alt%=%neu%! if not "!Name2!"=="!Name1!" echo ren "!Name1!" "!Name2!" %cmd% "!Name2!"=="!Name1!" ren "!Name1!" "!Name2!" ) rem ----------------------------------------------------------- rem Programmende rem ----------------------------------------------------------- :Exit echo. echo Dieses Fenster mit der Leertaste schliessen. pause > nul goto :eof rem ----------------------------------------------------------- rem Problematische Zeichen anzeigen rem ----------------------------------------------------------- :Error echo. echo Warnung: Die folgenden Dateinamen enthalten Zeichen, welche echo dieses Batchprogramm nicht verarbeiten kann. findstr "%% ^ &" "%temp%\dir.txt" goto :Exit
Die VBS-Lösung
Verwendung: Den Quelltext markieren, kopieren und dann in die Datei „NewName.vbs“ einfügen. „NewName.vbs“ muss im selben Verzeichnis abgelagert werden, wo sich die Dateien befinden, die umbenennt werden müssen.
Als nächstes Windows anweisen, das Programm „cscript.exe“ für die Verarbeitung zu gebrauchen. (Alternativ: Das Skript jedes Mal in einem CMD-Fenster ausdrücklich mit „cscript newname.vbs“ aufrufen.)
1. Start / Ausführen klicken.
2. cmd.exe tippen und OK klicken.
3. Den folgenden Befehl tippen: cscript //H:CScript {Enter}
4. Das schwarze Fenster schliessen.
Als letztes den Quelltext anpassen. Dazu müssen die folgenden 4 Zeilen geändert werden:
Const sTyp = „jpg“ ‚Dateityp. Z.B. jpg für Bilderdateien
Const sOne = „0000“ ‚Ursprüngliche Zeichenfolge
Const sTwo = „2008“ ‚Gewünschte Zeichenfolge
Const SubDir = False ‚True=Unterverzeichnisse bearbeiten, False=Unterverzeichnisse nicht bearbeiten
Quelltext
- ‚————————————————
- ‚Dieses Programm wird alle Dateien im gegenwärtigen Verzeichnis
- ‚umbenennen, indem die Zeichenfolge {alt} in den Dateinamen durch
- ‚die Zeichenfolge {neu} ersetzt wird.
- ‚Beispiel:
- ’set alt=0000
- ’set neu=-2008
- ‚Die Datei 12340000.jpg wird auf 1234-2008.jpg umbenannt.
- ‚Die Datei 9970000.jpg wird auf 976-2008.jpg umbenannt.
- ‚Die folgende Einstellungen müssen weiter unten vorgenommen werden
- ‚Const sTyp = „jpg“ ‚Dateityp. Z.B. jpg für Bilderdateien
- ‚Const sOne = „0000“ ‚Ursprüngliche Zeichenfolge
- ‚Const sTwo = „2008“ ‚Gewünschte Zeichenfolge
- ‚Const SubDir = False ‚True=Unterverzeichnisse bearbeiten, False=Unterverzeichnisse nicht bearbeiten
- ‚Datein werden nicht umbenannt, falls eine gleichnamige Datei schon existiert.
- ‚————————————————
- Option Explicit
- ‚——————————————–
- ‚Lokale Anpassungen
- ‚——————————————–
- Const sTyp = „jpg“ ‚Dateityp. Z.B. jpg für Bilderdateien
- Const sOne = „0000“ ‚Ursprüngliche Zeichenfolge
- Const sTwo = „2008“ ‚Gewünschte Zeichenfolge
- Const SubDir = False ‚True=Unterverzeichnisse bearbeiten, False=Unterverzeichnisse nicht bearbeiten
- Dim objFSO, objWshShell, objWMIService
- Dim CurrFolder, sOne_, Active, verb1, verb2, count
- ‚——————————————–
- ‚Ein paar Deklarationen
- ‚——————————————–
- Set objFSO = CreateObject(„Scripting.FileSystemObject“)
- Set objWshShell = WScript.CreateObject(„WScript.Shell“)
- Set objWMIService = GetObject(„winmgmts:\\.\root\cimv2“)
- CurrFolder = objWshShell.CurrentDirectory
- ‚—————————————————
- ‚Den Benutzer fragen, ob der Probelauf erwünscht ist
- ‚—————————————————
- Select Case MsgBox(„Dateien gleich umbenennen?“ _
- & “ (keinen Probelauf)“, 259, „Massen-Umbenennung von Dateien“)
- Case 6: Active = True
- Case 7: Active = False
- Case Else: WScript.Quit ‚Programm beenden
- End Select
- ‚—————————————————
- ‚Ein paar Sachen vorbereiten
- ‚—————————————————
- If Active Then
- verb1 = “ umbenannt auf „
- verb2 = “ Dateien wurden umbenannt.“
- Else
- verb1 = “ umbenennen auf „
- verb2 = “ Dateien würden umbenannt.“
- End If
- ‚—————————————————
- ‚Subroutine zur Umbenennung aufrufen
- ‚—————————————————
- count = 0
- sOne_ = UCase(sOne)
- ProcessFolder CurrFolder ‚Invoke the recursive rename program
- ‚—————————————————
- ‚Schlussbericht erstellen
- ‚—————————————————
- MsgBox (count & verb2)
- ‚============================
- ‚Subroutine
- ‚============================
- Sub ProcessFolder(FolderName)
- ‚———————-
- ‚Ein paar Deklarationen
- ‚———————-
- Dim objFile, objFolder, colFiles, colSubfolders, objF, FullName, p
- Set colFiles = objWMIService.ExecQuery _
- („ASSOCIATORS OF {Win32_Directory.Name='“ & FolderName & „‚} Where „ _
- & „ResultClass = CIM_DataFile“)
- ‚————————————
- ‚Eine Datei nach der andern behandeln
- ‚————————————
- For Each objFile In colFiles
- If objFile.Extension = sTyp Then ‚Bloss den richtigen Dateityp behandeln
- p = InStr(UCase(objFile.FileName), sOne_)
- If p > 0 Then
- FullName = FolderName & „\“ & objFile.FileName & „.“ & objFile.Extension
- WScript.Echo „Datei „ & FullName & verb1 & Replace(objFile.FileName, sOne, sTwo, 1, 1, 1) & „.“ & sTyp
- count = count + 1
- If Active Then
- Set objF = objFSO.GetFile(FullName)
- objF.Name = Replace(objFile.FileName, sOne, sTwo, 1, 1, 1) & „.“ & sTyp
- End If
- End If
- End If
- Next
- ‚————————————————————————-
- ‚Das Programm rekursiv aufrufen, falls Unterordner behandelt werden sollen
- ‚————————————————————————-
- if not SubDir then Exit Sub
- Set colSubfolders = objWMIService.ExecQuery _
- („Associators of {Win32_Directory.Name='“ & FolderName & „‚} „ _
- & „Where AssocClass = Win32_Subdirectory „ _
- & „ResultRole = PartComponent“)
- For Each objFolder In colSubfolders
- ProcessFolder objFolder.Name
- Next
- End Sub
http://faq-o-matic.net/?p=738