Ersetzen deutscher Schriftzeichen in Dateinamen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

hus

Ersetzen deutscher Schriftzeichen in Dateinamen

21 Sep 2021, 05:22

Hallo 👋 AHK-Anfänger hier. Wir haben ein echtes Standardproblem, was sicherlich schon vielfach gelöst wurde – Cleanup

Wir haben einen großen Ordner mit Dateien für den Web-Upload. Unsere Infrastruktur verträgt keine Großbuchstaben, Umlaute, ß oder Leerzeichen in Dateinamen.

Zwar wurden Dateinamen kleingeschrieben, Sonderzeichen schon beim Speichern in ue, ae, oe gewandelt und Leerzeichen in Bindestriche – aber es handelt sich tausende von Dateien – da kommt es  nun mal vereinzelt zu Fehlern.

Hat jemand von Euch vielleicht ein fertiges / leicht anpassbares Script  welches diese Art von Fehlern automatisch korrigiert? Wäre es weiterhin sinnvoll machbar, dass das Script den fraglichen Ordner  kontinuierlich überwacht und  beim Prüfen neuer Inhalten (non-modal) Feedback gibt?

Input:
bibo bürgermeister-Sesamstraße.jpg

bibo-buergermeister-sesamstrasse.jpg

Ich freue mich über Starthilfe!
KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Ersetzen deutscher Schriftzeichen in Dateinamen  Topic is solved

21 Sep 2021, 08:19

Benennt die Dateien um:

Code: Select all

#NoEnv
#Singleinstance Force
Setworkingdir,% A_ScriptDir
SetBatchLines, -1


ListeSonderZeichen := {"ß": "ss", "ö" : "oe", "ü":"ue", "ä":"ae", A_Space : "-"} ;gegebenenfalls Liste erweitern
UploadOdner := "C:\Temp\*.*" ;Ordnerpfad anpassen


Loop, Files, % UploadOdner
	if RegExMatch(A_LoopFileName, "[\sßöüäÄÜÖ]|[[:upper:]]")
	DateiNamenMitSonderZeichen .= A_LoopFileDir "\" A_LoopFileName "|" A_LoopFileDir "\" SonderZeichenErsetzen(A_LoopFileName, ListeSonderZeichen) "`r`n"

if (DateiNamenMitSonderZeichen != "")
	Loop, parse, DateiNamenMitSonderZeichen, `n, `r
	FileMove, % StrSplit(A_LoopField, "|").1, % StrSplit(A_LoopField, "|").2

SonderZeichenErsetzen(ZeichenKette, ListeSonderZeichen){
StringLower, ZeichenKette, ZeichenKette
i := 1
	For k, v in ListeSonderZeichen {
	k := (k = "A_Space") ? A_Space : k
	OhneSonderZeichen := (i = 1) ? StrReplace(ZeichenKette, k, v) : StrReplace(OhneSonderZeichen,k, v) 
	i++
	}
Return OhneSonderZeichen
}


zeigt ein MsgBox an, falls Dateiname, die Voraussetzungen nicht erfüllt.

Code: Select all

#NoEnv
#Singleinstance Force
Setworkingdir,% A_ScriptDir
SetBatchLines, -1

#Persistent 
UploadOdner := "C:\Temp\*.*" ;Ordnerpfad anpassen
SetTimer, OrdnerCheck, 300000 ;Überprüft alle 5 min. ob Dateinamen die Voraussetzungen erfüllen
Return

OrdnerCheck:
Loop, Files, % UploadOdner
	if RegExMatch(A_LoopFileName, "[\sßöüäÄÜÖ]|[[:upper:]]")
	MsgBox,64,Ungültige Dateiname,% "Datei " A_LoopFileName " erfüllt die Voraussetzungen nicht."
Return
hoja
Posts: 8
Joined: 21 Sep 2021, 05:07

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

21 Sep 2021, 15:27

Hallo KHA,
möglicherweise erscheint jetzt nach einem kleinen Schluckauf bei der Konto-Eröffnung ein anderer Username, aber ich bin der OP.

Was soll ich sagen: Vielen herzlichen Dank! 🙏 Das sieht äußerst hilfreich aus. Ich habe die Antwort erst entdeckt und erst kurz überflogen (keine Benachrichtigung bekommen) aber morgen schaue ich's mir genauer an und melde mich, falls ich noch weitere Fragen habe.
hoja
Posts: 8
Joined: 21 Sep 2021, 05:07

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

23 Sep 2021, 10:00

Nun hat es doch etwas länger gedauert. Es läuft alles und tut, was es soll. Prima. Da ich viel um die Ohren habe, bin ich tatsächlich auch sehr froh über das fertige Skript – das hätte doch einige Einarbeitungszeit gebraucht. Nochmals danke!

Die einzige Verbesserung, die ich mir noch vorstellen könnte, wäre das Vereinigen beider Scripts:

  • Ordner wird in regelmäßigen Intervallen gecheckt (wie aktuell im Script 2).
  • Nutzer fügt Dateinamen mit ungültigen Zeichen zum Ordner hinzu.
  • Skript wird aktiv und ersetzt die Zeichen.
  • Optional: Das Skript gibt Feedback, dass es Dateien umbenannt hat. Wenn alles ok ist, bleibt es ruhig.
KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

23 Sep 2021, 11:57

Beide Scripte habe ich kombiniert, aber vorher bitte Testen!

Code: Select all

#NoEnv
#Singleinstance Force
Setworkingdir,% A_ScriptDir
SetBatchLines, -1

#Persistent 
ListeSonderZeichen := {"ß": "ss", "ö" : "oe", "ü":"ue", "ä":"ae", A_Space : "-"} ;gegebenenfalls Liste erweitern
UploadOdner := "C:\Temp\*.*" ;Ordnerpfad anpassen

SetTimer, OrdnerCheck, 300000 ;Überprüft alle 5 min. ob Dateinamen die Voraussetzungen erfüllen
Return

OrdnerCheck:
DateiNamenMitSonderZeichen := ""

Loop, Files, % UploadOdner
	if RegExMatch(A_LoopFileName, "[\sßöüäÄÜÖ]|[[:upper:]]")
	DateiNamenMitSonderZeichen .= A_LoopFileDir "\" A_LoopFileName "|" A_LoopFileDir "\" SonderZeichenErsetzen(A_LoopFileName, ListeSonderZeichen) "`r`n"

if (DateiNamenMitSonderZeichen != "")
	Loop, parse, DateiNamenMitSonderZeichen, `n, `r
	{
	if (A_LoopField = "")
	continue

	MsgBox,64,Ungültige Dateiname,% "Datei "  StrSplit(A_LoopField, "|").1 " erfüllt die Voraussetzungen nicht, wird durch " StrSplit(A_LoopField, "|").2 " ersetzt!"
	FileMove, % StrSplit(A_LoopField, "|").1, % StrSplit(A_LoopField, "|").2
	}

Return


SonderZeichenErsetzen(ZeichenKette, ListeSonderZeichen){
StringLower, ZeichenKette, ZeichenKette
i := 1
	For k, v in ListeSonderZeichen {
	k := (k = "A_Space") ? A_Space : k
	OhneSonderZeichen := (i = 1) ? StrReplace(ZeichenKette, k, v) : StrReplace(OhneSonderZeichen,k, v) 
	i++
	}
Return OhneSonderZeichen
}
hoja
Posts: 8
Joined: 21 Sep 2021, 05:07

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

27 Sep 2021, 10:51

@KHA Vielen herzlichen Dank für das zweite Script – und Entschuldigung, dafür, dass meine Rückmeldung erneut so spät kommt!

Beim Testen sind mir zunächst hier und da ein paar Schwächen aufgefallen, die ich mir noch mal anschauen wollte. Heute habe ich das endlich getan und es stellte sich heraus, dass ich selbst durch Hinzufügen einer weiteren (eigentlich unnötigen) Ersetzungsregel dafür verantwortlich war (Fehlermeldung siehe Screenshot im Anhang).

Nachdem ich auf das unveränderte Script zurückgestellt hatte, war wieder alles in Ordnung. Tatsächlich macht dieses Script genau das, was ich beschrieben habe – und es meldet sich nur, wenn es was zu meckern hat. Demnach dürfte wohl nichts dagegen sprechen, es in den Autostart zu packen.

Darf ich mich mit einer kleinen Spende per Paypal revanchieren?
Attachments
2021-09-24_20h37_08.png
2021-09-24_20h37_08.png (9.58 KiB) Viewed 2306 times
KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

27 Sep 2021, 15:15

Grund für die Fehlermeldung in Screenshot ist, sie müssen die Datei als UTF-8 mit BOM abspeichern, siehe dazu:
https://ahkde.github.io/docs/FAQ.htm#nonascii
Darf ich mich mit einer kleinen Spende per Paypal revanchieren?
"
Um gottes willen, Alles gut, freut mich, dass ich helfen konnte :)
hoja
Posts: 8
Joined: 21 Sep 2021, 05:07

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

28 Sep 2021, 09:51

KHA wrote:
27 Sep 2021, 15:15
Um gottes willen, Alles gut, freut mich, dass ich helfen konnte :)
Wir freuen uns, danke!

@UTF-8: Ich hatte das Script mit Atom und einer AHK-Erweiterung gespeichert und die Hoffnung, dass es alles richtig macht. Vielleicht war das nicht der Fall.

Erklärt UTF-8 denn beide Fehler? Im Screenshot aus meinem letzten Post sieht man...
  • Encoding-Fehler in der Message des Alerts (erfüllt)
  • Unvollständige Korrektur der Textdatei. Großbuchstaben wurden ersetzt, die Umlaute nicht.
Ich hatte lediglich "_" : "-", ergänzt, um Unterstriche in Bindestriche zu wandeln. Nachdem ich meine Ergänzung gelöscht (und in Atom ohne weitere Anweisung) gespeichert habe, funktionierte das Skript wieder.


Nur wenn Sie noch Spaß an einer weiteren Knobelei haben... Gäbe es übrigens noch eine Möglichkeit...
  • Versehentliche Leerzeichen zu Beginn von Dateinamen, sowie am Ende zu strippen (derzeit werden diese durch – ersetzt) und...
  • doppelte dashes zu vermeiden? test - Copy.txt wird derzeit ersetzt durch test---copy.txt Das ist regelkonform, aber nicht ganz so schick.
Attachments
2021-09-28_16h45_47.png
2021-09-28_16h45_47.png (9.56 KiB) Viewed 2216 times
KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

28 Sep 2021, 12:02

hoja wrote:
28 Sep 2021, 09:51
Erklärt UTF-8 denn beide Fehler?
Ja, tut es :)

Ich habe den Script soweit erweitert:
  • "_" (Unterstrich) wird durch "-" (Bindestrich) ersetzt
  • Leerzeichen am Anfang und am Ende entfernt, (Wobei ich dachte immer, Windows läßt es nicht zu, dass am Anfang und Ende einer Datei Leerzeichen sind)
  • Mehrfach "-" (Bindestriche) werden ersetzt.

Code: Select all

#NoEnv
#Singleinstance Force
Setworkingdir,% A_ScriptDir
SetBatchLines, -1

#Persistent 
ListeSonderZeichen := {"ß": "ss", "ö" : "oe", "ü":"ue", "ä":"ae", "A_Space" : "-", "_" : "-"} ;gegebenenfalls Liste erweitern
UploadOdner := "C:\Temp\*.*" ;Ordnerpfad anpassen

SetTimer, OrdnerCheck, 300000 ;Überprüft alle 5 min. ob Dateinamen die Voraussetzungen erfüllen
Return

OrdnerCheck:
DateiNamenMitSonderZeichen := ""

Loop, Files, % UploadOdner
	if RegExMatch(A_LoopFileName, "[\sßöüäÄÜÖ]|[[:upper:]]")
	DateiNamenMitSonderZeichen .= A_LoopFileDir "\" A_LoopFileName "|" A_LoopFileDir "\" SonderZeichenErsetzen(A_LoopFileName, ListeSonderZeichen) "`r`n"

if (DateiNamenMitSonderZeichen != "")
	Loop, parse, DateiNamenMitSonderZeichen, `n, `r
	{
	if (A_LoopField = "")
	continue

	MsgBox,64,Ungültige Dateiname,% "Datei "  StrSplit(A_LoopField, "|").1 " erfüllt die Voraussetzungen nicht, wird durch " StrSplit(A_LoopField, "|").2 " ersetzt!"
	FileMove, % StrSplit(A_LoopField, "|").1, % StrSplit(A_LoopField, "|").2
	}

Return


SonderZeichenErsetzen(ZeichenKette, ListeSonderZeichen){
;StringLower, ZeichenKette, ZeichenKette
ZeichenKette := Trim(Format("{:L}", ZeichenKette))

i := 1
	For k, v in ListeSonderZeichen {
	k := (k = "A_Space") ? A_Space : k
	OhneSonderZeichen := (i = 1) ? StrReplace(ZeichenKette, k, v) : StrReplace(OhneSonderZeichen,k, v) 
	i++
	}
OhneSonderZeichen := RegExReplace(OhneSonderZeichen, "-{2}", "")
Return OhneSonderZeichen
}
hoja
Posts: 8
Joined: 21 Sep 2021, 05:07

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

28 Sep 2021, 14:31

Ja, tut es :)
Gut zu wissen. Dann sollte ich vorläufig beim Notepad bleiben.
Leerzeichen am Anfang und am Ende entfernt, (Wobei ich dachte immer, Windows läßt es nicht zu, dass am Anfang und Ende einer Datei Leerzeichen sind
Tatsächlich werden Dateien in einem Bildverwaltungsprogramm benannt – damit bekommt man offenbar beides hin: Leerzeichen am Anfang und am Ende des Namens. Beim Testen meiner simplen Textdateien mit Windows Explorer wurden Leerzeichen am Anfang des Dateinamens tatsächlich automatisch getilgt – aber am Ende konnte ich sogar mehrere unterbringen. 
Mehrfach "-" (Bindestriche) werden ersetzt.
Das klappt ebenfalls – aber im Screenshot fällt noch die letzte mögliche Perfektionierung auf:
  • Lösche Leerzeichen am Dateiende grundsätzlich –  ersetze sie nicht durch Bindestriche.
Ich habe zur größeren Deutlichkeit mehrere Leerzeichen am Ende eingefügt, aber die Ersetzung wäre bereits bei einem Leerzeichen am Ende ein Bindestrich.
2021-09-28_20h21_22.png
2021-09-28_20h21_22.png (9.14 KiB) Viewed 2170 times
Aber auch so ist das Skript schon 🚀
KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

28 Sep 2021, 15:52

Habe angepasst, hoffe es klappt jetzt alles.

Code: Select all

#NoEnv
#Singleinstance Force
Setworkingdir,% A_ScriptDir
SetBatchLines, -1

#Persistent 
ListeSonderZeichen := {"ß": "ss", "ö" : "oe", "ü":"ue", "ä":"ae", "A_Space" : "-", "_" : "-"} ;gegebenenfalls Liste erweitern
UploadOdner := "C:\Temp\*.*" ;Ordnerpfad anpassen

SetTimer, OrdnerCheck, 300000 ;Überprüft alle 5 min. ob Dateinamen die Voraussetzungen erfüllen
Return

OrdnerCheck:
DateiNamenMitSonderZeichen := ""

Loop, Files, % UploadOdner
	if RegExMatch(A_LoopFileName, "[\sßöüäÄÜÖ]|[[:upper:]]")
	DateiNamenMitSonderZeichen .= A_LoopFileDir "\" A_LoopFileName "|" A_LoopFileDir "\" SonderZeichenErsetzen(A_LoopFileName, ListeSonderZeichen) "`r`n"

if (DateiNamenMitSonderZeichen != "")
	Loop, parse, DateiNamenMitSonderZeichen, `n, `r
	{
	if (A_LoopField = "")
	continue

	MsgBox,64,Ungültige Dateiname,% "Datei "  StrSplit(A_LoopField, "|").1 " erfüllt die Voraussetzungen nicht, wird durch " StrSplit(A_LoopField, "|").2 " ersetzt!"
	FileMove, % StrSplit(A_LoopField, "|").1, % StrSplit(A_LoopField, "|").2
	}

Return


SonderZeichenErsetzen(ZeichenKette, ListeSonderZeichen){
ZeichenKette := Format("{:L}", ZeichenKette)
SplitPath, ZeichenKette ,,, AusEndung, AusNameOhneEnd
ZeichenKette := Trim(AusNameOhneEnd) "." AusEndung


i := 1
	For k, v in ListeSonderZeichen {
	k := (k = "A_Space") ? A_Space : k
	OhneSonderZeichen := (i = 1) ? StrReplace(ZeichenKette, k, v) : StrReplace(OhneSonderZeichen,k, v) 
	i++
	}
OhneSonderZeichen := RegExReplace(OhneSonderZeichen, "-+", "-")
Return OhneSonderZeichen
}
hoja
Posts: 8
Joined: 21 Sep 2021, 05:07

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

29 Sep 2021, 06:16

Funktionell passt jetzt alles!
Nun wollte ich die erlaubten Dateiformate anpassen und bin leider schon an dieser Kleinigkeit gescheitert. Dies war mein Versuch...

UploadOdner := "C:\Temp\*.psd; *.ai; *.png; *.cr2" ;Ordnerpfad anpassen

So scheint das jedenfalls noch nicht zu passen.

Im Prinzip könnten alle bekannten Dateiformate weiterhin erlaubt sein. Das Script benennt jedoch auch versteckte Dateien im Upload-Ordner um.

Unser Bildverwaltungsprogramm legt solche an, um auf programmspezifische  Sortierungen und Flags (Dateibewertungen, Label) zugreifen zu können. Werden diese Verwaltungs-Dateien (.BridgeSort) umbenannt, könnte es Probleme geben.

Kann man vielleicht noch global Dateien mit dem Attribut Hidden exkludieren? Das dürfte der sinnvollste Angang sein.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

29 Sep 2021, 06:24

Innerhalb des Loop's mit A_LoopFileExt gegenprüfen.
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

29 Sep 2021, 12:03

Kann man vielleicht noch global Dateien mit dem Attribut Hidden exkludieren? Das dürfte der sinnvollste Angang sein.
Ja, kann man:

Code: Select all

#NoEnv
#Singleinstance Force
Setworkingdir, % A_ScriptDir
SetBatchLines, -1

#Persistent 
ListeSonderZeichen := {"ß": "ss", "ö" : "oe", "ü":"ue", "ä":"ae", "A_Space" : "-", "_" : "-"} ;gegebenenfalls Liste erweitern
UploadOrdner := "C:\Temp\*.*" ;Ordnerpfad anpassen

SetTimer, OrdnerCheck, 300000 ;Überprüft alle 5 min. ob Dateinamen die Voraussetzungen erfüllen
Return

OrdnerCheck:
DateiNamenMitSonderZeichen := ""

Loop, Files, % UploadOrdner
{

	FileGetAttrib, IstVersteckt, % A_LoopFileLongPath
	if InStr(IstVersteckt, "H")
	continue

	if RegExMatch(A_LoopFileName, "[\sßöüäÄÜÖ]|[[:upper:]]")
	DateiNamenMitSonderZeichen .= A_LoopFileDir "\" A_LoopFileName "|" A_LoopFileDir "\" SonderZeichenErsetzen(A_LoopFileName, ListeSonderZeichen) "`r`n"

}

if (DateiNamenMitSonderZeichen != "")
	Loop, parse, DateiNamenMitSonderZeichen, `n, `r
	{
	if (A_LoopField = "")
	continue

	MsgBox,64,Ungültige Dateiname,% "Datei "  StrSplit(A_LoopField, "|").1 " erfüllt die Voraussetzungen nicht, wird durch " StrSplit(A_LoopField, "|").2 " ersetzt!"
	FileMove, % StrSplit(A_LoopField, "|").1, % StrSplit(A_LoopField, "|").2
	}

Return


SonderZeichenErsetzen(ZeichenKette, ListeSonderZeichen){
ZeichenKette := Format("{:L}", ZeichenKette)
SplitPath, ZeichenKette ,,, AusEndung, AusNameOhneEnd
ZeichenKette := Trim(AusNameOhneEnd) "." AusEndung


i := 1
	For k, v in ListeSonderZeichen {
	k := (k = "A_Space") ? A_Space : k
	OhneSonderZeichen := (i = 1) ? StrReplace(ZeichenKette, k, v) : StrReplace(OhneSonderZeichen,k, v) 
	i++
	}
OhneSonderZeichen := RegExReplace(OhneSonderZeichen, "-+", "-")
Return OhneSonderZeichen
}
hoja
Posts: 8
Joined: 21 Sep 2021, 05:07

Re: Ersetzen deutscher Schriftzeichen in Dateinamen

29 Sep 2021, 14:49

Großartig. Auch das funktioniert. So, jetzt ist aber wirklich Schluss mit dem Optimieren – vielen herzlichen Dank! Das Skript wird sicherlich jahrelang laufen – der Aufwand hat sich gelohnt 🙏 👋

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 27 guests