jschneider
Goto Top

Sonderzeichen in Dateinamen entfernen

Hallo,

auf diversen Fileservern habe ich einige Ordnernamen und Dateinamen, die Sonderzeichen enthalten. Dies stört das Backup und auch eine anstehende Filemigration/Konsolidierung.

Bezüglich dieses Themans habe ich schon einen Beitrag hier gefunden, der schon in die richtige Richtung geht (waves Bastla)
Mit VB Script Sonderzeichen entfernen.

Allerdings geht diese Lösung von "bekannten" Sonderzeichen aus und entfernt diese. Ich jedoch habe Sonderzeichen die im Prinzip nicht Bekannt sind (resultierend aus verschiedenen Sprachen (kyrillisch, chinesisch, japansch, marsianisch vogonisch etc..) Erlaubt sind diese Namen nicht und resultieren zum Großteil aus Downloads.

Ich kann daher keine "Negativ-Vergleichsdatei" benutzen sondern muss mit eine "Positiv-Liste" arbeiten.
z.B. a,A,b,B,c,C,d,D . .. . . 0,1,2,3,4,5,6,7,8,9,_,- usw. (na eben alles Englisch/Deutsche was unproblematisch ist. Eine oft in Posts angesprochene Umlautproblematik habe ich nicht.

Alle Zeichen in Dateinamen, die in der "Positiv-Liste" nicht enthalten sind sollen daher am besten entfernt werden.

Am liebsten wäre mir sogar noch eine "justreport"-Option, die erstmal nur reportet (Was wäre wenn) und eine zweite "Mach"-Option die es dann durchführt.

Hat sowas schon mal jemand umgesetzt ?


Grüße, Jan


edit : ob vbs oder cmd ist eigentlich egal

Content-Key: 77719

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

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

Member: bastla
bastla Jan 09, 2008 at 23:37:38 (UTC)
Goto Top
Hallo jschneider!

Nur zum Antesten:
'TidyFileNames.vbs  

sOrdner = "D:\Test"  
sLog = "D:\Log.txt"  
sPosList = ".0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"  
sDelim = ";"  

If WScript.Arguments.Count > 0 Then sOrdner = WScript.Arguments(0)

Set fso = CreateObject("Scripting.FileSystemObject")  

Set oLog = fso.OpenTextFile(sLog, 2, True)
ProcessFolder fso.GetFolder(sOrdner)
oLog.Close
WScript.Echo vbCrLF & "Done."  

Sub ProcessFolder(ThisFolder)
sPath = ThisFolder.Path
If InStr(sPath, "System Volume Information") = 0 Then  
	WScript.Echo sPath
	For Each File In ThisFolder.Files
		sOld = File.Name
		sNew = ""  
		For i = 1 To Len(sOld)
			sChar = Mid(sOld, i, 1)
			If InStr(sPosList, sChar) Then sNew = sNew & sChar
		Next
		oLog.WriteLine sPath & sDelim & sOld & sDelim & sNew

		'Um die Umbenennung tatsächlich durchzuführen, das  
		'Kommentarzeichen vor der nächsten Zeile entfernen:  
		'If sNew <> "" Then File.Name = sNew  
	Next
	For Each Folder In fso.GetFolder(ThisFolder).SubFolders
		ProcessFolder Folder
	Next
End If
End Sub
Der zu bearbeitende Start-Ordner ist zwar fest im Script eingetragen, er kann aber auch als Parameter beim Aufruf übergeben werden.

Die Positivliste ist leicht zu erweitern - einfach zwischen den Anführungszeichen die restlichen erlaubten Zeichen in beliebiger Reihenfolge eintragen.

Das Script verändert keine Dateinamen, sondern erstellt nur ein Log-File im Format CSV mit den Feldern Pfad;Dateiname alt;Dateiname neu. Überprüft wird dabei (anhand der selben Liste) auch der Dateityp, jedoch (noch) nicht die Schreibweise der Ordnernamen.

Es findet auch keine Fehlerbehandlung (zB für nicht-existenten Start-Ordner, fehlende Zugriffsrechte, etc) statt.

Gedacht ist diese Version für einen Aufruf von der Kommandozeile, zB
cscript //nologo C:\Scripts\TidyFileNames.vbs
oder
cscript //nologo C:\Scripts\TidyFileNames.vbs "D:\Anderer Testordner" 
damit der Pfad jedes eben bearbeiteten Ordners im CMD-Fenster ausgegeben werden kann (siehe Zeile WScript.Echo sPath). Würde das Script nicht mit "cscript" ausgeführt (also zB per Doppelklick oder als Drag&Drop-Ziel für einen Ordner), müsste für jeden Ordner eine MsgBox weggeklickt (oder einfach die genannte Zeile durch das Voranstellen eines Apostrophs deaktiviert) werden ...

Grüße
bastla

P.S.: Von welchem Server hast Du eigentlich die marsianisch benannten Files heruntergeladen? face-wink

[Edit] Ergänzung: Umbenennungsbefehl (als Kommentar) integriert - Umbenennung dabei nur, wenn neuer Name zumindest ein Zeichen enthält; allerdings weiterhin als Demo gedacht, da (noch) nicht geprüft wird, ob schon eine gleichnamige Datei vorhanden ist ... [/Edit]
Member: Biber
Biber Jan 13, 2008 at 15:11:22 (UTC)
Goto Top
Moin jschneider,

hattest Du schon Gelegenheit, bastlas Lösungsvorschlag zu lesen oder gar zu testen?

Gib ihm und dem Rest der interessierten MitleserInnen doch bitte ein Feedback.
Nicht weil hier im Forum irgendjemand Zweifel an bastlas Lösungen hätte, sondern weil es eigentlich zu den Grundregeln gehört, durch die so ein Forum funktionieren kann.

Danke
Biber
Member: jschneider
jschneider Jan 13, 2008 at 15:31:42 (UTC)
Goto Top
Hallo Biber,

nein noch nicht getestet.. zumindest nicht im Umfeld des Problems (mit Netware Fileshares), sondern nur auf meinem lokalen Notebook.

Sobald ich das habe werde ich wie üblich mich melden.. kann aber erst übernächste Woche wieder testen


@bastla,
kann es sein, das in der log.txt ALLE Dateien ausgeworfen werden, auch die, die NICHT "auffällig" sind ? kann man das irgendwie abfangen ?


Gruß und Danke
Member: bastla
bastla Jan 13, 2008 at 15:49:34 (UTC)
Goto Top
Hallo jschneider!

kann es sein, das in der log.txt ALLE Dateien ausgeworfen werden ...
Ja - war ja als Demo gedacht und sollte daher das Ergebnis (= gleicher oder veränderter Dateiname) für alle Dateien zeigen.

Für die von Dir gewünschte Ausgabe wäre nur die Zeile
oLog.WriteLine sPath & sDelim & sOld & sDelim & sNew
durch
If StrComp(sOld, sNew, vbTextCompare) <> 0 Then oLog.WriteLine sPath & sDelim & sOld & sDelim & sNew
zu ersetzen.

Grüße
bastla
Member: jschneider
jschneider Jan 13, 2008 at 17:20:38 (UTC)
Goto Top
Hallo bastla,

Sonntag Abend ein reply .. nicht schlecht herr Spec.. herr bastla ^^


vielen dank

wie gesagt, werde es übernächsten Montag Live auf den NetwareServern testen .. wobei die Funktion ja schon prima funktioniert..


für evtl. anpassungen und Berichte lasse ich den Thread aber noch offen

Schönen rest-Sonntag noch

Gruß, Jan
Member: jschneider
jschneider Feb 04, 2008 at 08:45:05 (UTC)
Goto Top
also, das klappt ganz wunderbar.

Die Liste der erlaubten Zeichen habe ich nochmal massiv erweitert ; man glaubt ja nicht was alles windows-konform ist face-wink


danke nochmal an dieser stelle
Member: bastla
bastla Feb 04, 2008 at 14:45:59 (UTC)
Goto Top
Hallo jschneider!

Freut mich, wenn's passt. face-smile

... man glaubt ja nicht was alles windows-konform ist face-wink
Klingt interessant - vielleicht magst Du ja noch Deine Liste (als krönenden Abschluss des Threads face-wink) posten ...

Grüße
bastla
Member: jschneider
jschneider Feb 04, 2008 at 15:36:26 (UTC)
Goto Top
Klingt interessant - vielleicht magst Du ja
noch Deine Liste (als krönenden
Abschluss des Threads face-wink) posten ...

ja gern,

sPosList = " ^°=+&%@$§~-_(){}!#'´;,.0123456789AaÄäBbCcDdEeFfGgHhIiJjKkLlMmNnOoÖöPpQqRrSsßTtUuÜüVvWwXxYyZz½úéîá"  

das sind so die sachen die wir erlauben
Member: danielwoe
danielwoe Jul 15, 2010 at 13:18:24 (UTC)
Goto Top
Hallo zusammen,

ich stehe momentan vor der Aufgabe einen Fileserver von Dateien mit exotischen Zeichen im Dateinamen zu befreien und habe auf der Suche nach einer Lösung bastlas Skript gefunden. Das Script funktioniert bei mir sehr gut und ist wirklich Gold wert.

Was allerdings noch fehlt ist eine zusätzliche Überprüfung der Ordnernamen. Leider kann ich kein VBS, sonst hätte ich mich selbst versucht. Ist es viel Aufwand das Script um eine Ordnernamenüberprüfung zu erweitern? Bastla hatte ja erwähnt, dass es (noch) nicht eingebaut ist. Vielleicht findet sich jemand der diesen Teil noch ergänzt? Dann ist es die Eierlegende Wollmilchsau. face-wink

Grüße
Daniel
Member: bastla
bastla Jul 17, 2010 at 15:26:46 (UTC)
Goto Top
Hallo danielwoe und willkommen im Forum!

Etwas erweitert sähe das dann so aus:
'TidyFileAndFolderNames.vbs  

sOrdner = "D:\Test"  
sLog = "D:\Log.txt"  
sPosList = ".0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"  
sDelim = ";"  

If WScript.Arguments.Count > 0 Then sOrdner = WScript.Arguments(0)

Set fso = CreateObject("Scripting.FileSystemObject")  

Set oLog = fso.OpenTextFile(sLog, 2, True)
ProcessFolder fso.GetFolder(sOrdner)
oLog.Close
WScript.Echo vbCrLF & "Done."  

Sub ProcessFolder(ThisFolder)
sPath = ThisFolder.Path
If InStr(sPath, "System Volume Information") = 0 Then  
	WScript.Echo sPath
    sOld = ThisFolder.Name
    sNew = ""  
    For i = 1 To Len(sOld)
        sChar = Mid(sOld, i, 1)
        If InStr(sPosList, sChar) Then sNew = sNew & sChar
    Next
    If StrComp(sOld, sNew, vbTextCompare) <> 0 Then
        If sNew <> "" Then   
            If Not fso.FolderExists(fso.GetParentFolderName(sPath) & "\" & sNew) And Not fso.FileExists(fso.GetParentFolderName(sPath) & "\" & sNew) Then  
                ThisFolder.Name = sNew
                oLog.WriteLine sPath & "\" & sDelim & sNew & "\"  
            Else
                oLog.WriteLine sPath & "\" & sDelim & sNew & sDelim & "#gleichnamige(s) Datei / Verzeichnis bereits vorhanden#"  
            End If
        End If
    End If
    
    sPath = ThisFolder.Path
    For Each File In ThisFolder.Files
        sOld = File.Name
        sNew = ""  
        For i = 1 To Len(sOld)
            sChar = Mid(sOld, i, 1)
            If InStr(sPosList, sChar) Then sNew = sNew & sChar
        Next
        If StrComp(sOld, sNew, vbTextCompare) <> 0 Then
            If sNew <> "" Then   
                If Not fso.FolderExists(sPath & "\" & sNew) And Not fso.FileExists(sPath & "\" & sNew) Then   
                    File.Name = sNew
                    oLog.WriteLine sPath & sDelim & sOld & sDelim & sNew
                Else
                    oLog.WriteLine sPath & sDelim & sOld & sDelim & sNew & sDelim & "#gleichnamige(s) Datei / Verzeichnis bereits vorhanden#"  
                End If
            End If
        End If
    Next
    For Each Folder In fso.GetFolder(ThisFolder).SubFolders
        ProcessFolder Folder
    Next
End If
End Sub
Der Sonderpreis für Eleganz ist damit zwar nicht zu gewinnen, aber das Script sollte jetzt so einigermaßen passen ...

Achtung - ist schon "scharf geschaltet" und ändert tatsächlich die Namen (falls nicht gewünscht, Zeilen 30 und 49 auskommentieren)!

Grüße
bastla
Member: danielwoe
danielwoe Jul 23, 2010 at 09:39:54 (UTC)
Goto Top
Hallo bastla und vielen Dank für die Erweiterung des Skripts!

Das Skript funktioniert super und ist in der aktuellen Fassung schon Gold wert. Allerdings gibt es noch ein Problem mit relativ exotischen Zeichen im Dateinamen. Sobald das Script bei mir in einem Ordner mit folgenden beiden Dateien ankommt

AW Вопросы к таблицам .txt
Вопросы Ё Грюневельду.doc

bricht es mit folgender Fehlermeldung ab:

H:\TidyFileAndFolderNames.vbs(54, 21) Laufzeitfehler in Microsoft VBScript: Ungü
ltiger Prozeduraufruf oder ungültiges Argument

Bei den Zeichen in den Dateinamen dürfte es sich um Zeichen aus dem kasachischen, kyrillischen Alphabet handeln. Die sind also ziemlich exotisch aber genau solche Zeichen machen sonst auch später bei der Backuperstellung Probleme.

Hast du eine Idee ob man diese Zeichen auch noch irgendwie mit dem Skript verarbeiten könnte oder stößt die VBS-Lösung dort an ihre Grenzen?

Gruß und Dank!
Daniel
Member: g202e
g202e Jan 28, 2011 at 12:33:20 (UTC)
Goto Top
Hallo bastla, großer Scriptmeister,
ich bekomme dein Script nicht richtig zum Laufen und habe keine Ahnung, warum.
Die fraglichen Dateien liegen auf einem NAS und ich habe den entsprechenden Ordner als Netzlaufwerk an meinem PC eingebunden.
Der Zugriff scheint auch nicht das Problem zu sein, denn es wird eine Log-Datei ausgegeben, in welcher auch fast alle Dateien auftauchen.
Leider werden genau jene, in welchen die "kryptischen" Sachen enthalten sind, einfach ignoriert.
Das Umbenennen funktioniert bei allen Dateien außer denen, für die es erforderlich wäre. Ich habe dies getestet, indem ich mal das Leerzeichen aus der Positivliste entfernt habe.
Promt werden aus den Dateinamen alle Leerzeichen entfernt. Jedoch werden die Dateien, welche wirklich kryptische Zeichen enthalten, einfach ignoriert.
Es handelt sich um Downloads aus dem Usenet und die kryptischen Zeichen waren ursprünglich mal Umlaute. Jetzt sind das wohl irgendwelche von Windows absolut nicht lesbare Zeichen,
welche z. B. im Totalcommander als "_" (Unterstrich) angezeigt werden...
Vielleicht hast du ja eine Idee dazu? Wäre sehr hilfreich für mich, da ich viel aus dem Usenet lade. Die Server stehen meist in US und da kennt man ja keine Umlaute...

Ich bedanke mich schon mal.
Member: bastla
bastla Feb 05, 2011 at 08:48:16 (UTC)
Goto Top
Hallo g202e!

Leider ist Deine Beschreibung nicht sehr konkret, bzw habe ich keine Dateien dieser Art zum Test bei der Hand.

Du könntest es mal damit versuchen, eine dieser Dateien per Drag & Drop an die folgende Batchdatei zu übergeben und das Ergebnis zu posten:
@echo off & setlocal
set F=%temp%\FileName.vbs
>%F% echo N=WScript.Arguments(0):L=Len(N):WScript.Echo L:For i=1 To L:Z=Mid(N,i,1):WScript.Echo Z^&":"^&Asc(Z):Next  
cscript //nologo %F% "%~nx1"  
del %F%
pause
Grüße
bastla
Member: g202e
g202e Feb 05, 2011 at 11:02:59 (UTC)
Goto Top
Hallo bastla,
vielen Dank dafür, dass du sogar am Wochenende deine Zeit opferst.
Ich habe getan, wie mir geheißen. Das Ergebnis ist für alle betroffenen Dateien dasselbe: Hinter dem als Unterstrich sichtbaren "kryptischen" Zeichen wird eine "95" angezeigt.

Ich weiß nicht, ob/wie man hier auch Bilder posten kann, deshalb habe ich eine Beispielausgabe mal http://img211.imageshack.us/i/bastlabatch.jpg/ hingelegt und hoffe, dass es lesbar ist.

(Die Datei heißt "103 - F_r Immer.mp3" und hinter dem großen "F" ist das entscheidende Byte)
Member: bastla
bastla Feb 05, 2011 at 11:13:38 (UTC)
Goto Top
Hallo g202e!

Das fragliche Zeichen wird als "normales" Zeichen (nämlich "_") interpretiert - insofern leider auch keine Erklärung ... face-sad

BTW: Du kannst Text aus einem CMD-Fenster sehr leicht kopieren, indem Du per Rechtsklick auf das "Systemmenü" (links in der Titelleiste des Fensters) die "Eigenschaften" öffnest, dort unter "Optionen" den "QuickEdit-Modus" aktivierst und dann einfach mit der linken Maustaste den Text markierst und mit einem Rchtsklick in die Zwischenablage übernimmst (wenn übrigens nichts markiert ist, wird per Rechtsklick im CMD-Fenster eingefügt).

Bilder kannst Du übrigens (nur) in (D)einem eigenen Beitrag in das Eröffnungsposting stellen.

Grüße
bastla
Member: g202e
g202e Feb 05, 2011 at 11:21:31 (UTC)
Goto Top
Danke sehr für die schnelle Rückmeldung.
Damit sind wir wohl am Ende der Fahnenstange. Denn deine anderen Scripte habe ich ja bereits erfolglos versucht und da wird ja eben der "Unterstrich" nicht als solcher gedeutet...

Nochmals danke und ich werde nun mal versuchen, auf der Linux-Konsole diese Zeichen zu entfernen...
Member: bastla
bastla Feb 05, 2011 at 17:10:16 (UTC)
Goto Top
Hallo g202e!

Sorry und good luck ...

Grüße
bastla
Member: e-horn
e-horn Apr 08, 2015 at 07:56:24 (UTC)
Goto Top
Zitat von @danielwoe:

Hallo bastla und vielen Dank für die Erweiterung des Skripts!

Das Skript funktioniert super und ist in der aktuellen Fassung schon Gold wert. Allerdings gibt es noch ein Problem mit relativ
exotischen Zeichen im Dateinamen. Sobald das Script bei mir in einem Ordner mit folgenden beiden Dateien ankommt

AW Вопросы к таблицам .txt
Вопросы Ё Грюневельду.doc

bricht es mit folgender Fehlermeldung ab:

H:\TidyFileAndFolderNames.vbs(54, 21) Laufzeitfehler in Microsoft VBScript: Ungü
ltiger Prozeduraufruf oder ungültiges Argument

Bei den Zeichen in den Dateinamen dürfte es sich um Zeichen aus dem kasachischen, kyrillischen Alphabet handeln. Die sind
also ziemlich exotisch aber genau solche Zeichen machen sonst auch später bei der Backuperstellung Probleme.

Hast du eine Idee ob man diese Zeichen auch noch irgendwie mit dem Skript verarbeiten könnte oder stößt die
VBS-Lösung dort an ihre Grenzen?

Gruß und Dank!
Daniel

Hallo, ich weiß der Thread ist schon paar Tage älter, bin aber eben auf diesen gestoßen und finde das Script sehr gut. Leider habe ich das selbe Problem wie danielwoe. Gibt es für das Problem eine Lösung? Mir ist dabei aufgefallen das das Script beim Aufruf zum umbennen eines Ordners in welchem sich mehrere solcher kryptisch bezeichneten Dateien befinden eine umbenennt bevor die Fehlermeldung kommt. Bei erneutem Aufruf benennt er die nächste um bevor er wieder abbricht. Was wäre wenn man die Fehlermeldung mal ignoriert und einfach eine Schleife (mit Anzahl der Datein = Schleifenanzahl) um das Script kreeiren würde? Hab leider null Ahnung von vbs, kann jmd helfen?

gruß ehorn