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.
Hier erkennt man die Problematik , die Datei "Hans: Im Glück.iso" kann natürlich nicht erstellt werden.
Gruss Tim
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 331253
Url: https://administrator.de/contentid/331253
Ausgedruckt am: 25.11.2024 um 23:11 Uhr
13 Kommentare
Neuester Kommentar
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
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
Ausgabe in TITLE.TXT = HansT: Im Glck 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
Ist immer ein bisschen kompliziert, wenn man nicht dieselben Voraussetzengen hat. Testen kann ich das also nicht ...
Grüße
rubberman
@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
rubberman
Du kannst jederzeit eine Variable definieren, bevor du Delayed Expansion einschaltest, à la
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.
set "ownpath=%~dp0"
setlocal EnableDelayedExpansion
echo !ownpath!