jentwickler
Goto Top

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 (%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

Content-Key: 196606

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

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

Member: pieh-ejdsch
pieh-ejdsch Jan 08, 2013 updated at 17:12:58 (UTC)
Goto Top
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:
setlocal enable delayedexpansion
set "Line=!Line:%C3%BC=ü!"
endlocal
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)
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
Member: Friemler
Friemler Jan 08, 2013 at 17:14:26 (UTC)
Goto Top
Hallo jentwickler,

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
Member: jentwickler
jentwickler Jan 09, 2013 updated at 10:52:25 (UTC)
Goto Top
Hallo pieh-ejdsch,

vielen Dank für Deine Antwort.

Ich denke, dass Du mich nicht ganz verstanden hast: Ich möchte die Zeichenkette %C3%BC durch ü ersetzen. Das macht aber nichts, denn:
  • entscheidend sind für mich die Zeilen:
  setlocal enable delayedexpansion
  set "Line=!Line:%C3%BC=ü!"  
  endlocal
  • Friemler hat mein Problem gelöst

Gruß
jentwickler
Member: jentwickler
jentwickler Jan 09, 2013 at 11:00:20 (UTC)
Goto Top
Hallo Friemler,

vielen Dank für Deine Antwort.

Du hast Recht: Die von mir beschriebenen Fehlermeldung bekommt man durch den Code-Schnipsel nicht. Da habe ich wohl zu wenig aus meinem Skript herauskopiert. Außerdem muss die Variable %TO_DELETE_FILE% %SHORT_PATH_FILE% heißen.

Du hast mir aber sehr geholfen. Vielen, vielen Dank.