kriegstreiber
Goto Top

Sonderzeichen aus einer Variable entfernen?

Ich versuche das so gut es geht in Worte zu fassen. Ich habe folgendes vor:

Eine Datei aus einem ISO Image entpacken - OK
Die Datei mit einem Tool auslesen - OK
Die Werte in eine Variable setzen - OK
Diese Variable von Sonderzeichen (z.B. ":" oder "TM" und "©") befreien - FAIL

Der Grund ist, das ich das ISO umbenennen will und zwar in den Namen den mir das Tool aus der entpackten Datei einliest. Wenn die Variable nun "Hans: Im Glück" heisst, dann soll daraus "Hans Im Glück" werden.


setlocal ENABLEDELAYEDEXPANSION
FOR /F "delims=*" %%I IN ('dir /b /s *.ISO') do (  
	rem chcp 1252 >nul 2>&1
	%MYFILES%\7z e "%%I" -o"%tmp%" *.sfo -r -y >nul 2>&1  
        FOR /F "tokens=*" %%A IN ('%MYFILES%\read_sfo "%tmp%\PARAM.SFO" TITLE') DO SET title=%%A >nul 2>&1  
	SET title=!title:~0,-1!
	MOVE /Y "%%I" "%%~dpI!title!.iso" >nul 2>&1  
	rem chcp 850 >nul 2>&1
	del "%tmp%\PARAM.SFO"  
	SET /a SUM=!SUM!+1 && echo  [!SUM!/%ISOFILES%] Done^^!
)

Hier erkennt man die Problematik , die Datei "Hans: Im Glück.iso" kann natürlich nicht erstellt werden.

Gruss Tim

Content-ID: 331253

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

Ausgedruckt am: 25.11.2024 um 23:11 Uhr

rubberman
rubberman 05.03.2017 um 13:18:27 Uhr
Goto Top
Hallo Kriegstreiber.

Grundsätzlich sind nur die Zeichen \/:*?"<>| nicht erlaubt. Was Trademark oder Copyright Zeichen (oder auch Umlaute oder sonstige Nicht-ASCII-Zeichen) angeht, kommt es darauf an, ob sie Bestandteil der verwendeten Codepage sind. Dazu müsstest du die Ausgabe von read_sfo mal in eine Datei umleiten und prüfen mit welcher Codierung geschrieben wird, sowie ob sich diese Codierung ändert wenn die Codepage der Console mit CHCP verändert wird. Das ist Voraussetzung um überhaupt zu wissen, wie man vorgehen muss.

Grüße
rubberman
Kriegstreiber
Kriegstreiber 05.03.2017 aktualisiert um 14:09:09 Uhr
Goto Top
Also ich habe das jetzt mal getestet. Folgendes passiert bei diesen Codes:

read_sfo PARAM.SFO TITLE >TITLE.TXT
Ausgabe in TITLE.TXT = HansT: Im Glck CODIERUNG: ANSI

chcp 1252 >nul
read_sfo PARAM.SFO TITLE >TITLE.TXT
Ausgabe in TITLE.TXT = Hans™: Im Glück CODIERUNG: ANSI

Also scheint das Tool wohl die Codepage zu nutzen, die ich im CMD festlege.

Aber in der Konsole bleibt es immer HansT: Im Glck


Auch interressant dieses hier:

chcp 1252 >nul 2>&1
!title! >title.txt
SET title = <title.txt
echo Title     : !title!

Er schreibt es richtig in die txt. Aber er bennent nun die ISO trotzdem nicht um, und zeigt auch in der Konsole wieder HansÖ Im Glck an ...
rubberman
rubberman 05.03.2017 um 14:24:57 Uhr
Goto Top
Ausgabe in TITLE.TXT = HansT: Im Glck CODIERUNG: ANSI
Dein Editor liest die Datei als wäre sie ANSI kodiert. Tatsächlich ist sie es aber nicht. Wie auch immer, es sieht so aus als müsstest du zumindest die Codepage auf Windows-1252 ändern, um zu einem einigermaßen sinnvollen Ergebnis zu kommen. So etwas funktioniert mit Batch aber nie mit 100% Sicherheit.

Ich versuch's mal nachzustellen
@echo off &setlocal

:: Ausgabe Windows-1252-codiert und mit "verbotenen" Zeichen versehen in eine Datei 
>nul chcp 1252
>"ausgabe.txt" echo(Hans™\/:?"<>|  Im Glück  
:: Test
type "ausgabe.txt"  

:: Aus Datei lesen
for /f "usebackq delims=" %%i in ("ausgabe.txt") do set "title=%%i"  

:: Zeichen ersetzen
setlocal EnableDelayedExpansion
set "title=!title:\=!"  
set "title=!title:/=!"  
set "title=!title::=!"  
set "title=!title:?=!"  
set "title=!title:"=!"  
set "title=!title:<=!"  
set "title=!title:>=!"  
set "title=!title:|=!"  

:: Resultat
echo(!title!

:: Versuch eine Datei damit zu erstellen...
>"!title!.txt" type nul  
pause

Eines der offensichtlichen Unzulänglichkeiten ist, dass ein * auf diese Weise nicht zu ersetzen ist. Da kannst du nur hoffen, dass es nicht vorkommt ...

Grüße
rubberman
Kriegstreiber
Kriegstreiber 05.03.2017 um 14:53:36 Uhr
Goto Top
Vielen Dank für den Ansatz, ich teste das ganze jetzt mal in Verbindung mit der Schleife face-smile.
Kriegstreiber
Kriegstreiber 05.03.2017 aktualisiert um 15:45:05 Uhr
Goto Top
Ich werde echt langsam verrückt, bin ich zu dämlich oder was übersehe ich. Hier dein Code auf mein Ziel umgewandelt:

FUNKTIONIERT:

@echo off &setlocal

:: Ausgabe Windows-1252-codiert und mit "verbotenen" Zeichen versehen in eine Datei 
>nul chcp 1252
read_sfo PARAM.SFO TITLE >"ausgabe.txt"  
rem >"ausgabe.txt" echo(Hans™\/:?"<>|  Im Glück  
:: Test
type "ausgabe.txt"  

:: Aus Datei lesen
for /f "usebackq delims=" %%i in ("ausgabe.txt") do set "title=%%i"  

:: Zeichen ersetzen
setlocal EnableDelayedExpansion
set "title=!title:\=!"  
set "title=!title:/=!"  
set "title=!title::=!"  
set "title=!title:?=!"  
set "title=!title:"=!"  
set "title=!title:<=!"  
set "title=!title:>=!"  
set "title=!title:|=!"  

:: Resultat
echo(!title!

:: Versuch eine Datei damit zu erstellen...
>"!title!.txt" type nul  
pause

Jetzt das ganze in meiner Schleife, FUNKTIONIERT NICHT

FOR /F "delims=*" %%I IN ('dir /b /s *.ISO') do (  
	rem chcp 437 >nul 2>&1
	echo  Analysing "%%~nI.ISO..."  
	7z e "%%I" -o"%tmp%" *.sfo -r -y >nul 2>&1  
	echo  "Read %%~nI.ISO Info..."  
	chcp 1252 >nul
	read_sfo "%tmp%\PARAM.SFO" TITLE >"title.txt"  
	type "title.txt"  
	for /f "usebackq delims=" %%i in ("title.txt") do set "title=%%i"  
	set "title=!title:\=!"  
	set "title=!title:/=!"  
	set "title=!title::=!"  
	set "title=!title:?=!"  
	set "title=!title:"=!"  
	set "title=!title:<=!"  
	set "title=!title:>=!"  
	set "title=!title:|=!"  

	:: Resultat
	echo(!title!
	
	pause

Wieder das alte Problem, er schreibts richtig in die txt Datei, aber beim einlesen scheiterts. Schon bei type "title.txt" (Zeile 08) fängt der Murks an und er zeigt mir HansÖ face-sad
rubberman
Lösung rubberman 05.03.2017 um 15:55:36 Uhr
Goto Top
Ist immer ein bisschen kompliziert, wenn man nicht dieselben Voraussetzengen hat. Testen kann ich das also nicht ...
@echo off &setlocal

>nul chcp 1252

FOR /F "delims=*" %%I IN ('dir /b /s *.ISO') do (  
	echo  Analysing "%%~nI.ISO..."  
	7z e "%%I" -o"%tmp%" *.sfo -r -y >nul 2>&1  
	echo  "Read %%~nI.ISO Info..."  
	read_sfo "%tmp%\PARAM.SFO" TITLE >"title.txt"  
	type "title.txt"  
	for /f "usebackq delims=" %%i in ("title.txt") do set "title=%%i"  
	setlocal EnableDelayedExpansion
	set "title=!title:\=!"  
	set "title=!title:/=!"  
	set "title=!title::=!"  
	set "title=!title:?=!"  
	set "title=!title:"=!"  
	set "title=!title:<=!"  
	set "title=!title:>=!"  
	set "title=!title:|=!"  

	REM Resultat
	echo(!title!
	endlocal
)

>nul chcp 850
pause
Grüße
rubberman
Kriegstreiber
Kriegstreiber 05.03.2017 um 17:17:19 Uhr
Goto Top
Merci, nu lüppts face-smile
rubberman
rubberman 05.03.2017 um 17:41:01 Uhr
Goto Top
Du kannst natürlich noch austesten, ob du den Umweg über "title.txt" wirklich brauchst (hatte ich eigentlich nur für mich zum Test drin). So wie ich das sehe, kannst du die Ausgabe von read_sfo auch gleich in einer FOR /F Schleife einfangen, wie ursprünglich von dir vorgesehen ...
Kriegstreiber
Kriegstreiber 05.03.2017 aktualisiert um 19:22:46 Uhr
Goto Top
Da teste ich mich gerade durch face-smile

Eine recht akzeptable Lösung ist diese hier:

FOR /F "tokens=* delims=" %%A in ('%MYFILES%\read_sfo "%TMPDIR%\C00_LICENSE_TMP\C00\PARAM.SFO" TITLE') do set "title=%%A"  
set "title=!title:\=!"  
set "title=!title:/=!"  
set "title=!title::=!"  
set "title=!title:?=!"  
set "title=!title:"=!"  
set "title=!title:<=!"  
set "title=!title:>=!"  
set "title=!title:|=!"  

Jetzt macht er mit ":" alles schön, allerdings schneidet er strings ab, wenn ein TM drin ist. Das kann aber auch woanders dran liegen, auf jeden Fall kann ich so damit leben.
rubberman
rubberman 05.03.2017 um 19:48:11 Uhr
Goto Top
Es hatte übrigens einen Grund, warum ich die verzögerte Variablenerweiterung für das Setzen der Variablenwerte immer ausgeschaltet habe. Wehe du hast mal Ausrufezeichen drin ...
Kriegstreiber
Kriegstreiber 05.03.2017 um 20:28:11 Uhr
Goto Top
Und genau bei dem Problem bin ich grrrrrrrr. Deshalb versuche ich mich auch so gut wie möglich von setlocal EnableDelayedExpansion fernzuhalten, denn jetzt funktioniert natürlich %~dp0 nimmer uaaaar, und mit !CD! kann ich nicht arbeiten, denn ich brauche das Verzeichnis, wo mein Tool drin liegt und das hat natürlich ein "!" im Namen :D
rubberman
Lösung rubberman 05.03.2017 aktualisiert um 20:50:57 Uhr
Goto Top
Du kannst jederzeit eine Variable definieren, bevor du Delayed Expansion einschaltest, à la
set "ownpath=%~dp0"  
setlocal EnableDelayedExpansion
echo !ownpath!
Einmal definiert, machst du mit dem Ausrufezeichen im Variablenwert nichts mehr kaputt (vorausgesetzt du nutzt immer umschließende Ausrufezeichen statt Prozentzeichen für die Variablen). Daumenregel ist also: Definiere Variablen mit ausgeschalteter verzögerter Variablenerweiterung, arbeite mit dem Wert mit eingeschalteter verzögerter Variablenerweiterung.
Kriegstreiber
Kriegstreiber 05.03.2017 um 21:09:03 Uhr
Goto Top
Wunderbar, ich hab das wieder mit Pfusch gelöst. War kurz davor das aufzugeben und Lazarus anzuschmeissen und das ganze mit Free Pascal zu machen. face-smile