uzehnder
Goto Top

suche Batch für Windows XP, das alle Dateinamen in Kleinschreibung umbenennt

Suche für einen Rechnern eine Batch-Automatisierung...

Suche ein Batch für Windows XP, das mir ab einem Ordner,
inkl. in allen Unterordnern,
alle Dateinamen in Kleinschreibung umbenennt,
dabei Umlaute und
"ß" durch ss
"Ä" und "ä" durch ae,
"Ö" und "ö" durch oe,
"Ü" und "ü" durch ue,
Leerzeichen durch _ (Unterstrich),
"-" durch _ (Unterstrich),
"(" und ")" durch _ (Unterstrich) ersetzt
Kommentar vom Moderator Biber am 17.11.2009 um 21:10:18 Uhr
Eigentlich hätte ich ja den Beitragsersteller noch fragen müssen, ob er als nun zufriedener Kunde nicht noch eine Kleinigkeit vergessen hat.
Aber da dieser Thread schon viel zu viele OffTopic-Passagen hat, setze ich mal schweigend den Beitrag auf "Gelöst.".

Content-Key: 129497

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: 60730
60730 16.11.2009 um 18:14:02 Uhr
Goto Top
Auch dir eine nette Begrüßungszeile vor den Latz geknallt

Das wird mit Bätsch nix und wie es mit VBS funktioniert - dazu einfach mal die Forensuche benutzen.
ps: +1 anspruchsvoll - war ein Versehen meinerseits.

Und Biber & ne Boomtown Rats haben mal wieder immer Montags - vollkommen recht...
Mitglied: miniversum
miniversum 16.11.2009 um 18:19:40 Uhr
Goto Top
Mal ungetestet:
@echo off
chcp 1252 >NUL

set "Root=C:\Ordner"  
FOR /F "delims=" %%i in ('dir /b /s "%root%"\*.*') do call:umbenennen "%%i"  
goto:eof

:umbenennen
set "Filename=%~1"  
set "Filename=%Filename:ö=oe%"  
set "Filename=%Filename:ä=ae%"  
set "Filename=%Filename:ü=ue%"  
rem unsd so weiter ...

ren "%~f1" "%Filename%"  
goto:eof
Die Liste msut du halt selbst fertig machen
Mitglied: bastla
bastla 16.11.2009 um 18:46:36 Uhr
Goto Top
Zwar, wie von miniversum gezeigt, per Batch machbar, aber besser (zumindest hinsichtlich ev weiterer Sonderzeichen) mit VBS:
Ordner = "D:\Test"  

Von  = Split(" |-|(|)|ß|ä|ö|ü", "|")  
Nach = Split("_|_|_|_|ss|ae|oe|ue", "|")  

V = UBound(Von)
If UBound(Nach) <> V Then
    WScript.Echo "Ersetzungstabellen nicht korrekt!"  
    WScript.Quit
End If

Set fso = CreateObject("Scripting.FileSystemObject")  
ProcessFolder fso.GetFolder(Ordner)
WScript.Echo vbCrLF & "Fertig."  

Sub ProcessFolder(ThisFolder)
If InStr(ThisFolder.Path, "System Volume Information") = 0 Then  
    For Each File In ThisFolder.Files
        Alt = File.Name
        Neu = LCase(Alt)
        For i = 0 To V
            Neu = Replace(Neu, Von(i), Nach(i))
        Next
        WScript.Echo File.Path & vbTab & "-->" & vbTab & Neu  
        'File.Name = Neu  
    Next
    For Each Folder In fso.GetFolder(ThisFolder).SubFolders
        ProcessFolder Folder
    Next
End If
End Sub
Zum Testen mit
cscript //nologo Scriptname.vbs
von der Kommandozeile starten, später dann die Zeile 24 entfernen oder durch vorangestelltes Apostroph auskommentieren und im Gegenzug Zeile 25 durch Entfernen des Kommentarzeichens aktivieren.

Derzeit nicht berücksichtigt ist die Möglichkeit, dass durch das Umbenennen in einem Ordner gleichnamige Dateien entstünden ...

This greeting intentionally left blank
Mitglied: Biber
Biber 16.11.2009 um 18:58:16 Uhr
Goto Top
<OT>
Moin bastla,
Zitat von @bastla:
This greeting intentionally left blank
Eigentlich hättest du sogar in dem Code-Kästchen schreiben müssen:
' Hier hätte eine Lösung für dich stehen können.  

@UZehnder
Wenn nicht schon so viele geantwortet hätten, dann hätte ich dir gezeigt, dass auch ein Blick aus dem Papierkorb neue Perspektiven bieten kann.
Poste bitte nie wieder montags so kurz angebunden.

Grüße
Biber
</OT>
Mitglied: bastla
bastla 16.11.2009 um 19:14:50 Uhr
Goto Top
[OT]
@Biber
Eigentlich hättest du sogar in dem Code-Kästchen schreiben müssen:
' Hier hätte eine Lösung für dich stehen können.  
Stimmt - aber ich lass mir doch (auch am Montag face-wink) nicht den Spaß am Scripten verderben ...

Grüße
bastla
[/OT]
Mitglied: TsukiSan
TsukiSan 17.11.2009 um 02:58:18 Uhr
Goto Top
moin@bastla,

wieder mal ein sauberes Script von dir!

Vielen Dank!

Tsuki

Ps.: ich hoffe, der Fragestellende weiß das zu schätzen und editiert sein Frage noch etwas.
Mitglied: 60730
60730 17.11.2009, aktualisiert am 18.10.2012 um 18:39:59 Uhr
Goto Top
Servus,
Zitat von @TsukiSan:
moin@bastla,

wieder mal ein sauberes Script von dir!

Vielen Dank!

Tsuki

Ps.: ich hoffe, der Fragestellende weiß das zu schätzen und editiert sein Frage noch etwas.

Da bleibt mir doch nichts anderes zu schreiben, als besser kann man es nicht sagen/schreiben.

@bastla:
Stimmt - aber ich lass mir doch (auch am Montag face-wink ) nicht den Spaß am Scripten verderben ...
Und ich hab deinen Beitrag auch in den reingetan.

"Dort" solltest du dann auch mal was dazu schreiben - wenns sein muß in Code Blöcken und jeweils ein Rem davor face-wink

Gruß
Mitglied: UZehnder
UZehnder 17.11.2009 um 13:37:58 Uhr
Goto Top
schönen guten Morgen
viele Dank für die Kommentare

dieser Lösungansatz von bastla in vbs scheint mir auch der bessere Weg zu werden.

"Derzeit nicht berücksichtigt ist die Möglichkeit, dass durch das Umbenennen in einem Ordner gleichnamige Dateien entstünden ..."
genau hier liegt mein neues Problem.

Wär es nicht möglich,
1. event. nur die DateiNamen ohne die Extension zu behandeln
2. nur die Dateien umzubenamsen, die einer Ersetzung gemäss Ersetzungstabelle bedürfen
3. diesen beim renamen am DateiNamen-Ende eine fortlaufende Nummerierung+dieweilige Extension anzuhängen (wie "DateiNamen.0001.ext")
?
So könnte ich aus der neuen Dateiliste auf einen Blick sehen, welche Dateien umbenamst wurden und wieviele,
zudem würde mir die Sortierfolge der Dateien wahrscheinlich gleichbleiben.


@Biber: werde mich in Zukunft bemühen, nur noch jeweils Dienstags, Mittwochs, Donnerstags, Freitags, Samstags und Sonntags kurzgebunden zu Posten.
Ne sorry, blödsinn - das war natürlich nicht meine Absicht, dazu schätze ich die Fach-Potenz hier zu seh.
Schönen Tag allen...
Mitglied: 60730
60730 17.11.2009 um 14:45:57 Uhr
Goto Top
Servus,

auf die Gefahr, dass du auch meine Potenz ansehn willst und ich keinen 5 Öhre Schlitz am Bildschirm hab...

1) wird aber arg kompliziert und magst du mal ein Beispiel nennen - wo das Sinn ergibt?
2) wie jetzt alle oder nicht alle - bzw. dort wo kein Umlaut - kein renamsen.
3) rename <> copy es gibt doch nur eine Datei... warum sollte die aufwärts gezählt werden?
und wenn das wirklich wichtig ist - mach einen anderen Thread dazu auf

Gruß
Mitglied: UZehnder
UZehnder 17.11.2009 um 15:16:05 Uhr
Goto Top
danke für die Antwort.

Alors:

2. Genau: wo kein Ersetzungszeichen - kein renamsen
3. Damit erreiche ich, dass keine gleichnamige Dateinamen entstehen können, zudem ersehen die jeweiligen UserInnen, dass diese Datei umbenamst wurde.
zu 1. Die Dateien liegen alle auf einem Sever in einer öffentlichen Verwaltung und werden von diversen SachbearbeiterInnen erstellt usw., doc-,xls-Dateien und alles was so mit
MS-Office Programmen erstellt werden kann... (ob da irgendwelche Dateiverknüpfungen mit eingebunden wurden, wissen nur dieselben),
ob's arg kompliziert wird ist egal, Hauptsache es funktioniert zuverlässig lässig...

leider grad keine 5 Öhre zur Hand

Gruss
Mitglied: bastla
bastla 17.11.2009 um 16:00:49 Uhr
Goto Top
Hallo UZehnder!
Wär es nicht möglich,
1. event. nur die DateiNamen ohne die Extension zu behandeln
Wäre möglich, wobei mich einigermaßen wundert, dass bei Euch tatsächlich (Office-)Datei-Extensions mit Umlauten oder den anderen genannten Sonderzeichen existieren ...
2. nur die Dateien umzubenamsen, die einer Ersetzung gemäss Ersetzungstabelle bedürfen
Also doch nicht generelle Kleinschreibung? Ansonsten wird ja ohnehin nix geändert, wenn nix zu ändern ist ...
3. diesen beim renamen am DateiNamen-Ende eine fortlaufende Nummerierung+dieweilige Extension anzuhängen (wie "DateiNamen.0001.ext")?
Diese Nummerierung soll sich vermutlich auf den jeweils bearbeiteten Ordner beziehen - reichen die 4 Stellen dafür? face-wink

Unter teilweiser Vorwegnahme der Antworten könnte das etwa so aussehen:
Ordner = "D:\Test"  

Von  = Split(" |-|(|)|ß|Ä|ä|Ö|ö|Ü|ü", "|")  
Nach = Split("_|_|_|_|ss|Ae|ae|Oe|oe|Ue|ue", "|")  

V = UBound(Von)
If UBound(Nach) <> V Then
    WScript.Echo "Ersetzungstabellen nicht korrekt!"  
    WScript.Quit
End If

Set fso = CreateObject("Scripting.FileSystemObject")  
ProcessFolder fso.GetFolder(Ordner)
WScript.Echo vbCrLF & "Fertig."  

Sub ProcessFolder(ThisFolder)
Path = ThisFolder.Path
If InStr(Path, "System Volume Information") = 0 Then  
    Nummer = 10001
    For Each File In ThisFolder.Files
        Alt = File.Name
        Ext = "." & fso.GetExtensionName(Alt)  
        If Ext = "." Then Ext = ""  
        Neu = fso.GetBaseName(Alt)
        For i = 0 To V
            Neu = Replace(Neu, Von(i), Nach(i))
        Next
        If Neu & Ext <> Alt Then
            Neu = LCase(Neu) & "." & Right(Nummer, 4) & LCase(Ext)  
            WScript.Echo File.Path & vbTab & "-->" & vbTab & Neu  
            'File.Name = Neu  
            Nummer = Nummer + 1
        End If
    Next
    For Each Folder In fso.GetFolder(ThisFolder).SubFolders
        ProcessFolder Folder
    Next
End If
End Sub
Grüße
bastla
Mitglied: UZehnder
UZehnder 17.11.2009 um 16:45:09 Uhr
Goto Top
WoW - einfach superb

Sorry für das Missverständniss, die (Office-)Datei-Extensions sind natürlich schon korrekt ohne Umlaute, etc..
Es ist so, dass einige Dateien schon jetzt korrekt sind, ohne Umlaute, Grossschreibung und Leerzeichen, nur diese brauchen nicht umbenamst zu werden.

Die Nummerierung mit 4 Stellen so pro Ordner ist perfekt.


Kleinschreibung ist aber für alle notwendig, falls man das im Script noch berücksichtigen könnte hätte ich ein Problem weniger.

Vielen Dank
Mitglied: bastla
bastla 17.11.2009 um 17:05:57 Uhr
Goto Top
Hallo UZehnder!

Noch nicht eindeutig war für mich, ob nun die Extensions (außer auf Kleinschreibung) geändert werden sollen - daher werden diese weiterhin ausgespart.

Ansonsten etwa so:
Ordner = "D:\Test"  

Von  = Split(" |-|(|)|ß|ä|ö|ü", "|")  
Nach = Split("_|_|_|_|ss|ae|oe|ue", "|")  

V = UBound(Von)
If UBound(Nach) <> V Then
    WScript.Echo "Ersetzungstabellen nicht korrekt!"  
    WScript.Quit
End If

Set fso = CreateObject("Scripting.FileSystemObject")  
ProcessFolder fso.GetFolder(Ordner)
WScript.Echo vbCrLF & "Fertig."  

Sub ProcessFolder(ThisFolder)
If InStr(Path, "System Volume Information") = 0 Then  
    Nummer = 10001
    For Each File In ThisFolder.Files
        Alt = File.Name
        Ext = "." & LCase(fso.GetExtensionName(Alt))  
        If Ext = "." Then Ext = ""  
        AltName = LCase(fso.GetBaseName(Alt))
        Neu = AltName
        For i = 0 To V
            Neu = Replace(Neu, Von(i), Nach(i))
        Next
        If Neu & Ext <> Alt Then
            If Neu <> AltName Then
                Neu = Neu & "." & Right(Nummer, 4)  
                Nummer = Nummer + 1
            End If
            Neu = Neu & Ext
            WScript.Echo File.Path & vbTab & "-->" & vbTab & Neu  
            'File.Name = Neu  
        End If
    Next
    For Each Folder In fso.GetFolder(ThisFolder).SubFolders
        ProcessFolder Folder
    Next
End If
End Sub
Grüße
bastla
Mitglied: UZehnder
UZehnder 17.11.2009 um 18:48:55 Uhr
Goto Top
Thanks

was ich nicht verstehe:
wenn ich im Ordner diese Datei habe
"dateiname_ok.DOC"
wird Fehler "script.vbs (35, 13) Microsoft VBScript runtime error: File already exists" erzeugt

dito wenn ich solche Dateinamen habe:
andereDateien.zumumbenamsen.doc
Dateien.zumumbenamsen.doc

dito:
Dateienzumumbenamsen.doc
andereDateienzumumbenamsen.doc

da reichen meine vbs Kenntnisse einfach nicht aus


Gruss
Mitglied: bastla
bastla 17.11.2009 um 19:08:05 Uhr
Goto Top
Hallo UZehnder!

Füge unmittelbar vor Zeile 35 folgende Zeile ein:
            Z = Int(Rnd*10000+10000): File.Name = Neu & Z
Leider hatte ich nur anhand der Ausgabe getestet (und das Script nicht wirklich umbenennen lassen face-sad) - dadurch war mir entgangen, dass VBS offensichtlich ein Problem damit hat, eine Datei auf den gleichen Namen (nur eben durchgängig in Kleinbuchstaben) umzubenennen (was BTW per Batch problemlos funktioniert).

Als Workaround wird mit der obigen Zeile zunächst eine temporäre Änderung (unter Verwendung einer Zufallszahl) und erst dann die endgültige Namensvergabe vorgenommen.

Grüße
bastla
Mitglied: UZehnder
UZehnder 17.11.2009 um 19:47:25 Uhr
Goto Top
Very Tricky

kann Mann viel lernen aus deinen Script's

jetzt läufts wunderbra

mit bestem Dank
und Gruss aus meiner Papierkorb Perspektive
Mitglied: Biber
Biber 17.11.2009 um 21:41:38 Uhr
Goto Top
Hmmm, tja,

eigentlich wollte ich ja gar nicht das letzte Wort in diesem Beitrag an mich reißen.
Sondern nur den Beitrag noch auf "Erledigt" setzen, aber dann...

@bastla
Zwei Anmerkungen/Nachfragen zu dem Schnipsel:
a) wenn der Dateiname zuerst auf LCase() gebracht wird, reduziert sich die Konvertierungstabelle auf
...
Von  = Split(" |-|(|)|ß|ä|ö|ü", "|")
Nach = Split("_|_|_|_|ss|ae|oe|ue", "|")
...
Jezz' nicht nur wegen Geschwindigkeitstuning, mehr wegen Wartbarkeit...


b) Weil es mir ja doch keine Ruhe lässt, wenn ich nicht frage:
Füge unmittelbar vor Zeile 35 folgende Zeile ein:
Z = Int(Rnd*10000+10000):
?? Sind da jetzt nicht zwei Zähler im umbenamsten Dateinamen (einer von Nummer, einer von Z) ??
?? Was ist der Grund für das "...+10000" in der Z-Berechnungszeile? Nur ästhetische Erwägungen/einheitlch nochmal 5 Zeichen anhängen?

Grüße
Biber

[Edit 22:05] Thx @bastla
Alle Fragen beantwortet.
@ TypeLib/GUID -----> *lach*
Nich' mit Melonen auf Spätzle hauen oder so heißt es doch...
[/Edit]
Mitglied: bastla
bastla 17.11.2009 um 22:01:32 Uhr
Goto Top
@Biber
zu a)
War in der letzten Fassung (nachdem geklärt war, dass auf jeden Fall die Kleinbuchstabenvariante umgesetzt werden soll) schon wieder so enthalten - zwischendurch ging's allerdings nicht anders ...

zu b)
Aus reiner Panik (hatte ich für vor dem Abendessen nicht einkalkuliert gehabt) entstanden ... face-wink
?? Sind da jetzt nicht zwei Zähler im umbenamsten Dateinamen (einer von Nummer, einer von Z) ??
Ja - aber nicht lang face-wink; das Problem waren nicht die mit Zählern versehenen (und damit ohnehin schon veränderten Dateinamen), sondern die Tatsache, dass ein Umbenennen von zB "Text.txt" nach "text.txt" den von UZehnder genannten Fehler liefert - daher musste für Sekundenbruchteile ein anderer Name her, der dann wieder auf das eigentlich gewünschte Ergebnis geändert werden konnte.
?? Was ist der Grund für das "...+10000" in der Z-Berechnungszeile? Nur ästhetische Erwägungen/einheitlch nochmal 5 Zeichen anhängen?
Genau wie Du es vermutest: Ich wollte mit dem "+10000" die 5-Stelligkeit erreichen (vermutlich hätten's auch 2 Stellen getan - schließlich wird die Zahl ja an die Extension angefügt - aber da andererseits Dateitypen mit Umlauten und Wer-weiß-was nicht ausgeschlossen wurden, wollte ich nicht knausern) ...

... und
Set TypeLib = CreateObject("Scriptlet.TypeLib")  
Z = TypeLib.Guid
war mir zu dem Zeitpunkt leider noch nicht bekannt.

Grüße
bastla
Mitglied: UZehnder
UZehnder 19.11.2009 um 01:01:58 Uhr
Goto Top
Hallo

Ups
jetzt komm ich nochmal mit einer Frage.

Könnte man ein (neues) gleiches VBS-Batch erstellen, das diesmal, ab dem Ordner,
alle Ordner- und UnterordnerNamen mit derselben Ersetzungstabelle renamst?

alle OrdnerNamen in Kleinschreibung umbenennt,
dabei Umlaute und
"ß" durch ss
"Ä" und "ä" durch ae,
"Ö" und "ö" durch oe,
"Ü" und "ü" durch ue,
Leerzeichen durch _ (Unterstrich),
"-" durch _ (Unterstrich),
"(" und ")" durch _ (Unterstrich) ersetzt.

(Dieses aber ohne die angehängte Nummerierung)


wünsche allen eine arbeitsreichen Donnerstag

gruss
UZehnder
Mitglied: 60730
60730 19.11.2009 um 01:18:06 Uhr
Goto Top
Servus,

bitte nicht....so egoistisch sein...

Deine Frage war - suche Batch für Windows XP, das alle Dateinamen in Kleinschreibung umbenennt

Bastla hat zwar keine Batch abgeliefert, aber dafür war Miniversum so frei, dir ne Batch zu zimmern.

Nun kommt eine "ähnliche" Anforderung - und wer weiß das? . nur die - die diesen Fred kennen oder andere, die Ihn später mal finden.

Und nu? komplett andere Baustelle ist es ja nicht - kann Mann viel lernen aus deinen Script's.... Frau auch? man[n] man[n] man[n]

und wenn das wirklich wichtig ist - mach einen anderen Thread dazu auf
WLKIKIV

N8.
Mitglied: TsukiSan
TsukiSan 19.11.2009 um 04:09:34 Uhr
Goto Top
...und benutze bastlas Script als Lösungsansatz!
Ordner benennt man um, indem man
Object.MoveFolder Alt, Neu
benutzt.

Gruss
Tsuki

Ps.: warten alle auf den neuen Thread
Mitglied: bastla
bastla 19.11.2009 um 07:04:13 Uhr
Goto Top
@tsuki
Auch für Ordner reicht eine Änderung des ".Name" ...

[Edit]
... allerdings hätte "MoveFolder" den Vorteil, dass kein temporäres Umbenennen erforderlich ist, wenn sich nur Groß- auf Kleinschreibung ändern soll.
[/Edit]

Grüße
bastla
Mitglied: UZehnder
UZehnder 20.11.2009 um 01:00:39 Uhr
Goto Top
Danke für die Tipp's

ich versuch's mal ganz alleine
dos vorherige vbs in der Richtung abzuändern.


@timobeil
hab auch was gegen Sex-Flaute
hast natürlich recht: auch Frau darf...

schon wieder etwas zugelehrnt: vbs ist kein Batch
und Hightech-Sex existiert wirlich

Falls ich's nicht schaffe mache gerne neuen Thread auf

Grüsse
UZ