Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Umlaute in Pfadangaben

Frage Entwicklung Batch & Shell

Mitglied: goodbytes

goodbytes (Level 2) - Jetzt verbinden

01.12.2014, aktualisiert 09:44 Uhr, 1334 Aufrufe, 8 Kommentare

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
Mitglied: Meierjo
LÖSUNG 01.12.2014, aktualisiert um 09:44 Uhr
Hallo

Probier mal anfang der Batch

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

Gruss Urs
Bitte warten ..
Mitglied: goodbytes
01.12.2014 um 09:45 Uhr
Hallo Urs,
stimmt, das ist natürlich das Einfachste...
geht einwandfrei, vielen Dank!

Gruß
Torsten
Bitte warten ..
Mitglied: Friemler
LÖSUNG 01.12.2014, aktualisiert um 11:56 Uhr
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]
Bitte warten ..
Mitglied: goodbytes
01.12.2014 um 09:59 Uhr
Ok, Danke!
Bitte warten ..
Mitglied: goodbytes
01.12.2014 um 14:50 Uhr
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:
01.
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
Bitte warten ..
Mitglied: Friemler
LÖSUNG 01.12.2014, aktualisiert 02.12.2014
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
Bitte warten ..
Mitglied: goodbytes
02.12.2014, aktualisiert um 09:46 Uhr
Hallo Friemler,
das funktioniert bestens, vielen Dank!

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:
01.
Bezeichnung 1;D:\Test Ordner\Datei 1.txt 
02.
Bezeichnung 2;D:\Test Ordner\Datei 2.txt
Und nun meine Batch:
01.
@ECHO OFF & chcp 1252 
02.
 
03.
for /f "tokens=*" %%i in (Test.txt) do (^ 
04.
for /f "tokens=1 delims=;" %%j in ("%%i") do (^ 
05.
for /f "tokens=2 delims=;" %%k in ("%%i") do (^ 
06.
for /f "delims=" %%l in ("%%i") do (^ 
07.
call :RUN "%%i" "%%j" "%%k" "%%~nxi")))) 
08.
EXIT 
09.
 
10.
:RUN 
11.
echo Ganze Zeile %1% >> Ergebnis.txt 
12.
echo Bezeichnung %2% >> Ergebnis.txt 
13.
echo Pfad inkl. Dateiname %3% >> Ergebnis.txt 
14.
echo Dateiname %4% >> Ergebnis.txt 
15.
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 !!!

Gruß
Torsten
Bitte warten ..
Mitglied: Friemler
02.12.2014, aktualisiert um 20:27 Uhr
Hallo Torsten,

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):

01.
@echo off & setlocal 
02.
 
03.
set "InFile=Test.txt" 
04.
set "OutFile=Ergebnis.txt" 
05.
 
06.
chcp 1252 > NUL 
07.
 
08.
for /f "usebackq delims=" %%a in ("%InFile%") do ( 
09.
  for /f "tokens=1,2 delims=;" %%b in ("%%a") do ( 
10.
    call :ProcessLine "%%a" "%%b" "%%c" "%%~nxc" 
11.
12.
13.
 
14.
chcp 850 > NUL 
15.
 
16.
exit /b 0 
17.
 
18.
 
19.
:ProcessLine 
20.
  (echo Ganze Zeile: %~1 
21.
   echo Bezeichnung: %~2 
22.
   echo Pfad inkl. Dateiname: %~3 
23.
   echo Dateiname: %~4 
24.
   echo. 
25.
  ) >> "%OutFile%" 
26.
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:

01.
@echo off & setlocal 
02.
 
03.
set "InFile=Test.txt" 
04.
set "OutFile=Ergebnis.txt" 
05.
 
06.
chcp 1252 > NUL 
07.
 
08.
(for /f "usebackq delims=" %%a in ("%InFile%") do ( 
09.
   for /f "tokens=1,2 delims=;" %%b in ("%%a") do ( 
10.
     echo Ganze Zeile: %%a 
11.
     echo Bezeichnung: %%b 
12.
     echo Pfad inkl. Dateiname: %%c 
13.
     echo Dateiname: %%~nxc 
14.
     echo. 
15.
16.
)) > "%OutFile%" 
17.
 
18.
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Exchange Server
gelöst Exchange 2013 - Abwesenheitsnachricht Umlaute werden nicht dargestellt (3)

Frage von staybb zum Thema Exchange Server ...

Linux
gelöst Umlaute zählen - Bash-Script (5)

Frage von plutowitsch zum Thema Linux ...

Batch & Shell
Altebekanntes Batch umlaute Problem (txt editor) (2)

Frage von Ritrivia zum Thema Batch & Shell ...

Windows Server
gelöst Server verchluckt Umlaute (9)

Frage von Azubine zum Thema Windows Server ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...