Prozentzeichen in Zeichenketten ersetzen
Hallo zusammen,
zuerst einen Dank an das Forum: sehr informativ.
Leider habe ich (noch) keine Lösung für mein Problem gefunden. Ich habe eine Datei mit URL encodierten Pfaden (
Meine Datei sieht also folgendermaßen aus:
Am Ende möchte ich, dass meine Datei wie folgt aussieht:
Folgendes versuche ich gerade:
Die Zeile 5 geht wunderbar, in der Zeile 6 bekomme ich: Der Befehl "20" ist entweder falsch geschrieben oder konnte nicht gefunden werden. Leider komme ich an der Stelle nicht mehr weiter. Mit setlocal enabledelayedexpansion habe ich auch schon probiert, leider auch ohne Erfolg.
Ich bin für jeden Hinweis dankbar.
Gruß
jentwickler
zuerst einen Dank an das Forum: sehr informativ.
Leider habe ich (noch) keine Lösung für mein Problem gefunden. Ich habe eine Datei mit URL encodierten Pfaden (
%20
für Leerzeichen, %C3%9F
für ß
, %C3%BC
für ü
usw.). Diese Pfade möchte in die für batch lesbaren Pfade konvertieren (/
durch \
, %20
durch Leerzeichen, %C3%9F
durch ß
, %C3%BC
durch ü
usw. ersetzen). Ich verzweifle gerade an der Ersetzung der %20
durch ein Leerzeichen, sowie %C3%BC
durch ü
.Meine Datei sieht also folgendermaßen aus:
2%20Ree%C3%BCddde/2%20DV/IUndS/I_O_B_R.doc
2%20Rng%C3%BChme/2%20DV/IUdS/I_R_B.doc
2%20Rg%C3%BChme/2%20D/IUndtus/K%20uf%20der%20g%20der%20Rg%20ne.doc
Am Ende möchte ich, dass meine Datei wie folgt aussieht:
2 Reeüddde\2 DV\IUndS\I_O_B_R.doc
2 Rngühme\2 DV\IUdS\I_R_B.doc
2 Rgühme\2 D\IUndtus\K uf der g der Rg ne.doc
Folgendes versuche ich gerade:
set SHORT_PATH_FILE=path.txt
for /f "tokens=1,* delims=]" %%A in ('"type %TO_DELETE_FILE%|find /v /n """') do (
set "LINE=%%B"
if defined line (
call set "LINE=%%LINE:/=\%%"
call set "LINE=%%LINE:%%20= %%"
call set "LINE=%%LINE:%%C3%%BC=ü%%"
for /f "delims=" %%X in ('"echo."%%LINE%%""') do %%~X
) ELSE (echo)
)
Die Zeile 5 geht wunderbar, in der Zeile 6 bekomme ich: Der Befehl "20" ist entweder falsch geschrieben oder konnte nicht gefunden werden. Leider komme ich an der Stelle nicht mehr weiter. Mit setlocal enabledelayedexpansion habe ich auch schon probiert, leider auch ohne Erfolg.
Ich bin für jeden Hinweis dankbar.
Gruß
jentwickler
Please also mark the comments that contributed to the solution of the article
Content-Key: 196606
Url: https://administrator.de/contentid/196606
Printed on: April 26, 2024 at 11:04 o'clock
4 Comments
Latest comment
moin jentwickler,
die CMD liest den Pfad doch mit Backslash statt Slash ein.
im Batch wird jede potentiell darstellbare Variable auch dargestellt.
somit wird im call nicht die Variable Line aufgelöst, sondern Line: (da: %%Line:%%).
Desweiteren befindest Du Dich inerhalb einer Klammer und somit auf einer Befehlszeile.
Dadurch wirst Du die Variable Line nur zur Laufzeit erhalten:
Da gibt es wiederum die Variable C3 oder aber BC nach welcher aufgelöst wird. (je nach dem was zuerst von Prozentzeichen umschlossen wird) Die Variablen sollten zuvor geleert werden, sonst ist dort irgenetwas Fremdes Drin (jedenfalls auf der CMD-Line mit einfachen Prozentzeichen)
Die Parameter %1 - %9 musst Du in eine Sub als die Darzustellenden Zeichenfolgen angeben
(einen entspechenden workaround gibt es von Biber finde grad die Quelle nicht)
Auf der CMD-Line ist es nicht so kompliziert - in etwa gleich so (für die Dateinamen nacher ohne die Option /d ):
Gruß Phil
die CMD liest den Pfad doch mit Backslash statt Slash ein.
im Batch wird jede potentiell darstellbare Variable auch dargestellt.
somit wird im call nicht die Variable Line aufgelöst, sondern Line: (da: %%Line:%%).
Desweiteren befindest Du Dich inerhalb einer Klammer und somit auf einer Befehlszeile.
Dadurch wirst Du die Variable Line nur zur Laufzeit erhalten:
setlocal enable delayedexpansion
set "Line=!Line:%C3%BC=ü!"
endlocal
set "C3="
set "C3=%%C3%%"
set "BC="
set "BC=%%BC%%"
echo %C3%BC
Die Parameter %1 - %9 musst Du in eine Sub als die Darzustellenden Zeichenfolgen angeben
(einen entspechenden workaround gibt es von Biber finde grad die Quelle nicht)
call :sub %%1 %%2 %%3
...
exit /b
:sub
set "Line=!Line:%20= !"
set "Line=!Line:%C3%BC=ü!"
Auf der CMD-Line ist es nicht so kompliziert - in etwa gleich so (für die Dateinamen nacher ohne die Option /d ):
for /d /r "D:\Pfad" %a in (*) do @set "A=%a" &set "N=%~nxa" &cmd /von /c"set "N=!N:%20=!" &set "N=!N:%C3%BC=ü!" & echo ren "!A!" - "!N!" &ren "!A!" "!N!""
Gruß Phil
Hallo jentwickler,
der Code da oben hat bei Dir wirklich was anderes gemacht als Fehlermeldungen auszugeben? Na, denn...
Sollte so gehen:
Falls Du möchtest, dass die Ausgabedatei in ANSI-Codierung erzeugt wird, speichere das Script auch in ANSI-Codierung ab, z.B. mit Notepad.
Falls Du möchtest, dass die Ausgabedatei in der Codierung OEM850 (Codepage 850) erzeugt wird oder Du die Ausgabe des Scripts mit einem Batchfile weiterverarbeiten willst, speichere das Script in der Codierung OEM850 ab, z.B. mit Notepad++.
Die Codes für
Gruß
Friemler
der Code da oben hat bei Dir wirklich was anderes gemacht als Fehlermeldungen auszugeben? Na, denn...
Sollte so gehen:
@echo off & setlocal enabledelayedexpansion
set "InFile=path.txt"
set "OutFile=path_new.txt"
(for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%InFile%"') do (
set "Line=%%b"
if defined Line (
set "Line=!Line:/=\!"
set "Line=!Line:%%20= !"
set "Line=!Line:%%C3%%A4=ä!"
set "Line=!Line:%%C3%%B6=ö!"
set "Line=!Line:%%C3%%BC=ü!"
set "Line=!Line:%%C3%%9F=ß!"
set "Line=!Line:%%C3%%84=Ä!"
set "Line=!Line:%%C3%%96=Ö!"
set "Line=!Line:%%C3%%9C=Ü!"
for %%x in ("!Line!") do echo %%~x
) else (
echo.
)
)) > "%OutFile%"
Falls Du möchtest, dass die Ausgabedatei in ANSI-Codierung erzeugt wird, speichere das Script auch in ANSI-Codierung ab, z.B. mit Notepad.
Falls Du möchtest, dass die Ausgabedatei in der Codierung OEM850 (Codepage 850) erzeugt wird oder Du die Ausgabe des Scripts mit einem Batchfile weiterverarbeiten willst, speichere das Script in der Codierung OEM850 ab, z.B. mit Notepad++.
Die Codes für
äöüßÄÖÜ
sind in ANSI und OEM850 verschieden!Gruß
Friemler