pgmende
Goto Top

Dateien mittels Batch umbenennen, dabei Sonderzeichen entfernen

Probleme beim Umbenennen von Dateien - Sonderzeichen machen Schwierigkeiten

Hallo!

Ich versuche gerade, abgespeicherte Emails (.eml-Dateien) mittels Batchdatei umzubenennen. Betriebssystem: Windows 2000 Prof. / Windows XP Prof.

Mein Ziel ist es, in den Dateinamen den Absender und den Betreff, zumindest gekürzt, unterzubringen.
Die Batch sieht bis dahin folgendermaßen aus:
@echo off & setlocal

SET pfad=D:\EMail-Backup

FOR /F %%i IN ('dir /b %pfad%\*.eml') DO CALL :Datenex %%i  

exit

:Datenex
FOR /F "TOKENS=*" %%s IN ('type %pfad%\%1 ^| find "Subject: "') DO SET subject=%%s  
FOR /F "Tokens=1 delims=<" %%t IN ('type %pfad%\%1 ^| find "From: "') DO SET from=%%t  
SET subject=%subject:?utf-8?q?=%
SET subject=%subject:^==%
SET subject=%subject:?iso-8859-1?Q?=%
SET subject=%subject:?ISO-8859-1?B?=%
SET subject=%subject:^=C3^=A4=ae%
SET subject=%subject:~9,20%
echo.
echo %subject%
SET from=%from:"=%  
SET from=%from:\=%
SET from=%from:(=%
SET from=%from:?UTF-8?Q?=%
SET from=%from:^==%
SET from=%from:~6,15%
echo %from%
:EOF

Das Umbenennen findet hier noch nicht statt - mir werden aktuell nur die Ergebnisse angezeigt, aber:
Probleme macht mir folgende Zeile:
SET subject=%subject:^=C3^=A4=ae%

Ich habe nämlich Mails, die im Betreff folgendes haben:
Subject: =?utf-8?q?T=C3=A4glicher_Spambericht_Mailbox

Die Fragezeichen bekomme ich ja weg, aber die ISTGLEICH (=) - Zeichen nicht, da die ja als Teil des Befehls verwendet werden. Das Maskieren mit ^ hat scheinbar keine Auswirkung. Was mache ich da falsch, bzw. wie muß das richtig maskiert werden?
Bin für jeden Tip dankbar face-smile

Viele Grüße,
Andreas

Content-Key: 142692

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

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

Mitglied: 77559
77559 May 12, 2010 at 11:01:29 (UTC)
Goto Top
moin Andreas,

wenn das dekodieren von "Encoded Words" in Mime Headern so einfach wäre siehe RFC2047, dann könnte es ja jeder face-wink

Zu deinem Problem,
ändere die enthaltenen Gleichheitszeichen zu Anfang in etwas anderes um, dazu eignet sich der delims der for schleife.
@Echo off
set "subject=Subject: =?utf-8?q?T=C3=A4glicher_Spambericht_Mailbox"  
Echo Original %subject%
for /f "tokens=1-10 delims==" %%A in ("%subject%"  
  ) do set "subject=%%A#%%B#%%C#%%D#%%E#%%F#%%G#%%H#%%I#%%J"  
echo.         %subject%
SET "subject=%subject:?utf-8?q?=%"  
SET "subject=%subject:?iso-8859-1?Q?=%"  
SET "subject=%subject:?ISO-8859-1?B?=%"  
SET "subject=%subject:#C3#A4=ae%"  
SET "subject=%subject:#=%"  
SET "subject=%subject:~9,20%"  
echo.Ziel     %subject%

Du solltest auch um Probleme mit sonderzeichen zu vermeiden den set Befehl in Anführungszeichen setzen.

Gruß
LotPings
Member: pgmende
pgmende May 12, 2010 at 11:20:07 (UTC)
Goto Top
Besten Dank, LotPings!

Das führt genau zum Ergebnis. Saustark!

Viele Grüße,
Andreas
Member: Biber
Biber May 12, 2010 at 11:48:23 (UTC)
Goto Top
Moin pgmende und LotPings,

wenn allerdings klar sein sollte, dass 90% oder mehr der zu archivierenden Malis die "Täglichen Spamberichte" sind und genau diesen Betreff haben, dann würde ich aus Performance und Wartbarkeitsgründen genau diesen konkreten Fall (ggf vorab) abfackeln.

Beispiel ab CMD-Prompt:
>set "mySubject=Subject: =?utf-8?q?T=C3=A4glicher_Spambericht_Mailbox"  

>echo Set mysubject=%mysubject:*glicher_Spambericht=Subject: Täglicher_Spambericht%
Set mysubject=Subject: Täglicher_Spambericht_Mailbox

Grüße
Biber
Member: pgmende
pgmende May 12, 2010 at 12:12:04 (UTC)
Goto Top
Hallo Biber,

besten Dank für den Tip.
Die Quote wird aber bei weitem nicht erreicht. Jedoch konnte ich das Problem der Maskierung mit LotPings Tip umgehen. Richtig perfomant ist das Ganze nicht, fällt im Moment aber nicht weiter ins Gewicht.
Ich frage mich nur, ob die Umbenennungsorgie mit "sed" (GnuWin32) etwas komfortabler, performanter und sicherer wäre....

Viele Grüße,
Andreas
Member: Biber
Biber May 12, 2010 at 13:04:54 (UTC)
Goto Top
Moin pgmende,

Zitat von @pgmende:
Richtig perfomant ist das Ganze nicht, fällt im Moment aber nicht weiter ins Gewicht.
Ich frage mich nur, ob die Umbenennungsorgie mit "sed" (GnuWin32) etwas komfortabler, performanter und sicherer wäre....

Dazu drei eher abstraktere Gedanken (ohne Codefragmente).

1) Wenn es stabil funktioniert ("Ergebnis passt") und es keinen stört, ob der unbeaufsichtigte Batchlauf nun 12 Sekunden oder 112 Sekunden dauert.. so what? Lass den Schnipsel so so und füge bestenfalls noch ein paar kommentarzeilen dazu, falls du dort erst in einem halbem Jahr für irgendeine Anpassung reinschauen musst.

2) Ja, mit sed ginge es sicherlich flotter, aber erstens nicht les- und wartbarer und zweitens... falls du noch keine Berührungspunkte mit sed hattest, brauchst du erstmal drei Stunden, um dich da reinzufummeln.... und wenn der mögliche Performanzgewinn sagen wir mal 10 Sekunden wären, dann gilt nach Adam Riese und Biber:
Einmaliger Einarbeitungs/Entwicklungsaufwand für Umstellung auf SED = 3 Stunden = = 180 Minuten 10800 Sekunden
Tägliche (Lauf-)Zeitersparsparnis = 10 Sekunden
---> Eine Rechtfertigung für die drei Sed-Aufwandsstunden hast du erst nach 1080 Tagen, erst dann "rechnet" es sich. Also irgenwann im Jahr 2013.
Anders sähe es aus, wenn du 108 Sekunden pro Tag Laufzeit einsparst... dann "rechnet" es sich nach 100 Tagen, also nach deinem Urlaub. face-wink

3) Ich habe auch mit regelmäßig (oft mehrmals täglich) eintrudelnen generierten Mails zu kämpfen in meiner Outlook-Mailbox und benenne die meist per VBA-Makro automatisch beim Eintreffen um. Solltest du auch überlegen, falls diese Mails bei dir in der Anzeige auch den Betreff "Subject: =?utf-8?q?T=C3=A4glicher_Spambericht_Mailbox" haben.

Grüße
Biber