Umlaute in Pfadangaben
Hallo,
ich stehe leider immer noch vor dem leidigen Thema Umlaute in Batches...
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
ich stehe leider immer noch vor dem leidigen Thema Umlaute in Batches...
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 256333
Url: https://administrator.de/contentid/256333
Ausgedruckt am: 25.11.2024 um 04:11 Uhr
8 Kommentare
Neuester Kommentar
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]
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]
Hallo Torsten,
in Batchscript gibt es Operatoren zur Zerlegung von Pfadangaben, die
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:
Ich habe hier die Option
Das Extrahieren des Dateinamens (oder eben genauer gesagt des letzten Pfadbestandteils) übernimmt das
Ein ausführliches Tutorial rund um den
Gruß
Friemler
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
Hallo Torsten,
na ja, Optimierungspotenzial findet sich in fast jedem Code . Bei Deinem Code sind es vor allem zwei überflüssige
Wenn in dem Unterprogramm
Was gerade bei einer großen Anzahl an Ausgaben einen enormen Geschwindigkeitsgewinn bringt, ist die Klammerung von Ausgabeoperationen so wie im Unterprogramm
Statt
Gruß
Friemler
na ja, Optimierungspotenzial findet sich in fast jedem Code . 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