goodbytes
Goto Top

Umlaute in Pfadangaben

Hallo,
ich stehe leider immer noch vor dem leidigen Thema Umlaute in Batches... face-plain
Bei Dateinamen und in den Pfaden für das Verschieben von Dateien sind öfters Umlaute enthalten.
Wie kann ich das am einfachsten in der Batch händeln?

Zur Info...
Die Dateinamen und Pfadangaben werden aus einer txt-Datei gelesen und verarbeitet. Eventuell könnte ich alle eventuell auftretenden Umlaute in dieser txt-Datei zu Beginn meiner Verschiebe-Batch erst durch Zeichen, welche dann auch korrekt gelesen werden können, ersetzen? Hätte in diesem Fall jemand eine Vorlage?

Danke im Voraus!
Gruß
Torsten

Content-ID: 256333

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

Ausgedruckt am: 25.11.2024 um 04:11 Uhr

Meierjo
Lösung Meierjo 01.12.2014 aktualisiert um 09:44:55 Uhr
Goto Top
Hallo

Probier mal anfang der Batch

rem Codepage ändern, damit ä ö ü Zeichen im Dateinamen richtig übersetzt werden
chcp 1252 > nul

Gruss Urs
goodbytes
goodbytes 01.12.2014 um 09:45:54 Uhr
Goto Top
Hallo Urs,
stimmt, das ist natürlich das Einfachste...
geht einwandfrei, vielen Dank! face-smile

Gruß
Torsten
Friemler
Lösung Friemler 01.12.2014 aktualisiert um 11:56:51 Uhr
Goto Top
Hallo Torsten,

am besten Du speicherst die txt-Datei mit den Pfadangaben in der Zeichencodierung / Codepage OEM850. Das ist das Codierungsschema, das standardmäßig von der Windows-Konsole verwendet wird. Ein Texteditor, der diese Codierung beherrscht, ist z.B. Notepad++.

Gruß
Friemler


[EDIT]
Da war ich zu langsam...
[/EDIT]
goodbytes
goodbytes 01.12.2014 um 09:59:44 Uhr
Goto Top
Ok, Danke! face-smile
goodbytes
goodbytes 01.12.2014 um 14:50:54 Uhr
Goto Top
Aber mal noch eine kurze andere Frage zwecks einer for-Schleife, vielleicht hat da auch noch jemand einen Tipp...

Ich lese eine Testdatei zeilenweise ein mittels:
for /f "tokens=1 delims=\" %%i in (Test.txt) do (echo "%%i")  

Wie kann ich nur den LETZTEN Teil ermitteln, also den String nach dem letzten "\"?

Gruß
Torsten
Friemler
Lösung Friemler 01.12.2014, aktualisiert am 02.12.2014 um 08:55:33 Uhr
Goto Top
Hallo Torsten,

in Batchscript gibt es Operatoren zur Zerlegung von Pfadangaben, die

  • in Laufvariablen von FOR-Schleifen oder
  • in Parameter-Variablen (%1, %2, usw.)

gespeichert sind.

Wenn Du also aus einer Pfadangabe, die aus einer Textdatei kommt, den letzten Pfadbestandteil extrahieren möchtest, könntest Du das so machen:

for /f "usebackq delims=" %%i in ("Test.txt") do (echo "%%~nxi")

Ich habe hier die Option usebackq verwendet, da man dann den Pfad zur Eingabedatei in der Klammer von FOR in Anführungszeichen einschließen und somit auch eine Dateie verarbeiten kann, deren Pfad bzw. Name Leerzeichen enthält.

Das Extrahieren des Dateinamens (oder eben genauer gesagt des letzten Pfadbestandteils) übernimmt das nx in %%~nxi. Dabei steht n für Name und x für Extension (incl. Punkt).

Ein ausführliches Tutorial rund um den FOR-Befehl, verzögerte Variablenerweiterung, die o.g. Operatoren zur Pfadzerlegung u.v.m. findest Du hier.

Gruß
Friemler
goodbytes
goodbytes 02.12.2014 aktualisiert um 09:46:00 Uhr
Goto Top
Hallo Friemler,
das funktioniert bestens, vielen Dank! face-smile

Da ich die einzelnen Bestandteile jeder Zeile für die Weiterverarbeitung benötige habe ich es jetzt folgendermaßen gemacht. Ich hab immer eine Zeile komplett in eine Variable eingelesen und dann weiter "zerpflückt".

Hier erstmal eine Beispiel-Quelldatei:
Bezeichnung 1;D:\Test Ordner\Datei 1.txt
Bezeichnung 2;D:\Test Ordner\Datei 2.txt

Und nun meine Batch:
@ECHO OFF & chcp 1252

for /f "tokens=*" %%i in (Test.txt) do (^  
for /f "tokens=1 delims=;" %%j in ("%%i") do (^  
for /f "tokens=2 delims=;" %%k in ("%%i") do (^  
for /f "delims=" %%l in ("%%i") do (^  
call :RUN "%%i" "%%j" "%%k" "%%~nxi"))))  
EXIT

:RUN
echo Ganze Zeile %1% >> Ergebnis.txt
echo Bezeichnung %2% >> Ergebnis.txt
echo Pfad inkl. Dateiname %3% >> Ergebnis.txt
echo Dateiname %4% >> Ergebnis.txt
echo. >> Ergebnis.txt

Weiß nicht ob man da noch was optimieren könnte aber es funktioniert so prima und ist übersichtlich finde ich.

Vielen Dank Meierjo und Friemler !!! face-smile

Gruß
Torsten
Friemler
Friemler 02.12.2014 aktualisiert um 20:27:14 Uhr
Goto Top
Hallo Torsten,

na ja, Optimierungspotenzial findet sich in fast jedem Code face-wink. Bei Deinem Code sind es vor allem zwei überflüssige FOR-Schleifen (das sind Performance-Fresser):

@echo off & setlocal

set "InFile=Test.txt"  
set "OutFile=Ergebnis.txt"  

chcp 1252 > NUL

for /f "usebackq delims=" %%a in ("%InFile%") do (  
  for /f "tokens=1,2 delims=;" %%b in ("%%a") do (  
    call :ProcessLine "%%a" "%%b" "%%c" "%%~nxc"  
  )
)

chcp 850 > NUL

exit /b 0


:ProcessLine
  (echo Ganze Zeile: %~1
   echo Bezeichnung: %~2
   echo Pfad inkl. Dateiname: %~3
   echo Dateiname: %~4
   echo.
  ) >> "%OutFile%"  
exit /b

Wenn in dem Unterprogramm ProcessLine die Strings wirklich nur ausgegeben werden sollen, kann man die Ausgabe auch direkt in der FOR-Schleife erledigen. Das hat außerdem den Vorteil, dass auch Zeichenketten ausgegeben werden könnten, die Batch-Sonderzeichen wie <|>&! enthalten, da zur Ausgabe die Laufvariablen der FOR-Schleife benutzt würden. Bei deren Verarbeitung ist der Batchscript-Interpreter nicht so zickig wie bei "normalen" Batchvariablen.

Was gerade bei einer großen Anzahl an Ausgaben einen enormen Geschwindigkeitsgewinn bringt, ist die Klammerung von Ausgabeoperationen so wie im Unterprogramm ProcessLine. Die Ausgabedatei muss dann nur einmal geöffnet werden, was viel Zeit spart. Bei den 5 Zeilen, die durch ProcessLine zusammengefasst werden, bringt das bei z.B. 100000 Aufrufen so gut wie nichts. Wenn jedoch auf das Unterprogramm verzichtet werden kann, ist der folgende Code beträchtlich schneller:

@echo off & setlocal

set "InFile=Test.txt"  
set "OutFile=Ergebnis.txt"  

chcp 1252 > NUL

(for /f "usebackq delims=" %%a in ("%InFile%") do (  
   for /f "tokens=1,2 delims=;" %%b in ("%%a") do (  
     echo Ganze Zeile: %%a
     echo Bezeichnung: %%b
     echo Pfad inkl. Dateiname: %%c
     echo Dateiname: %%~nxc
     echo.
   )
)) > "%OutFile%"  

chcp 850 > NUL

Statt tokens=1,2 kann man auch tokens=1* schreiben, dann könnte (in diesem Fall) der Dateipfad auch das als Trennzeichen verwendete Semikolon enthalten.

Gruß
Friemler