batzjunior
Goto Top

setlocal enableDelayedExpansion/disableDelayedExpansion-Wechsel

Hallo @ alle,

ich stehe vor dem Problem, dass ich für eine Operation "enableDelayedExpansion" brauche, dieses jedoch an einer anderen Stelle stört. Eine Variable, die ich aus einem File auslese beinhaltet nämlich Ausrufezeichen, welche samt nachstehendem Text einfach "rausgeschmissen" werden. Ein Wechsel zwischen enableDelayedExpasnion und DisableDelayedExpansion ist aber auch nicht so einfach möglich, da dabei entweder der Wert, wofür ich enable... brauche, aufgrund des endlocal nicht mehr verfügbar ist oder aber der Wert aus dem File beschnitten wird. Gibt es eine Möglichkeit, auf den Wert auch nach dem endlocal noch zuzugreifen?

Vielen Dank!

Daniel

Content-Key: 47162

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

Printed on: April 25, 2024 at 20:04 o'clock

Member: Biber
Biber Dec 20, 2006 at 15:41:46 (UTC)
Goto Top
Moin BatzJunior,

wäre eventuell besser erklärbar an einem kleine Codefetzen....

Magst Du mal ein Fragment mit dem relevanten Problem posten?

Danke
Biber
Member: BatzJunior
BatzJunior Dec 20, 2006 at 16:11:13 (UTC)
Goto Top
OK, also:

Zum Anfang lese ich die XML-Datei zeilenweise aus und belege die Variable 'wert' je nach Inhalt entsprechend fester Feldlängen mit Leerzeichen:

for /f "delims=>< tokens=1,2" %%f IN (%1) DO CALL :loop %%f "%%g"

:loop
set wert1=%1
set wert2=%2
IF (%wert1%)==(Satzart) set "zeichenfolge=%wert2:~1,-1%" & goto :writeTemp
IF "%wert1%"=="Belegnummer" set "wert= " & goto :beginn
IF "%wert1%"=="Kundennummer" set "wert= " & goto :beginn
::.....
set "wert="

:beginn
if (%wert1:~-3%)==(xml) goto :eof
if (%wert1:~0,1%)==(/) echo Schluss & goto :writeFinal
if (%wert2%)==("Daten") goto :eof
if (%wert2%)==("") set wortlaenge=0 & goto :auffuellen
if (%wert2:~0,2%^")==(""^") goto :laengenbestimmung ::Ueberspringen der naechsten Ueberpruefung
if (%wert2:~1,1%)==(/) set wortlaenge=0 & goto :auffuellen

:laengenbestimmung
::Ersetzung einiger Sonderzeichen/Sonderfaelle
set werte=%wert2%
set werte=%werte:Ö=OE%
set werte=%werte:Ü=UE%
::....
::Laengenbestimmung des Strings
(echo %werte%>x) & for %%i in (x) do @set /a wortlaenge=%%~zi-2
::abzueglich der beiden Leerzeichen vorne und hinten
set /a wortlaenge=%wortlaenge%-2


:auffuellen
if %wortlaenge%==0 set "zeichenfolge=%wert%" & goto :writeTemp
::Abschneiden der Gänsefuesschen
set zeichenfolge=%werte:~1,-1%
::Hier die Stelle, bei der ich enableDelayedExpansion brauche
::%wert% wird um die Länge des Strings minimiert
set wert=!wert:~0,-%wortlaenge%!
::für 'zeichenfolge' allerdings schon nicht mehr, da innerhalb derer die besagten '!' vorkommen
::Zusammenfuegen von %zeichenfolge% und der übriggebliebenen Leerzeichen von %wert%
set zeichenfolge=%zeichenfolge%%wert%

:writeTemp
Set "Zeile=%Zeile%%zeichenfolge%"
goto :eof

:writeFinal
if "%wert1%"=="/Kopf" echo %Zeile%>>dates.txt & set Zeile=& goto :eof
if "%wert1%"=="/Position" echo %Zeile%>>dates.txt & set Zeile=& goto :eof
goto :eof

Vielen Dank!

Daniel
Member: Biber
Biber Dec 20, 2006 at 16:18:57 (UTC)
Goto Top
Moin BatzJunior,

Skizze:

...
:auffuellen
if %wortlaenge%==0 set "zeichenfolge=%wert%" & goto :writeTemp  
::Abschneiden der Gänsefuesschen
set zeichenfolge=%werte:~1,-1%
::Hier die Stelle, bei der ich enableDelayedExpansion brauche
::%wert% wird um die Länge des Strings minimiert
<b>Setlocal enableDelayedExpansion
set wertInnen=!wert:~0,-%wortlaenge%!
endlocal & set "wert=%wertInnen%"  
</b>
::für 'zeichenfolge' allerdings schon nicht mehr, da innerhalb derer die besagten '!' vorkommen 
::Zusammenfuegen von %zeichenfolge% und der übriggebliebenen Leerzeichen von %wert%
<b>REM Ggf explizites "Setlocal DisableDelayedExpansion</b>  
set zeichenfolge=%zeichenfolge%%wert%

.....

[Ungetestete Skizze]

Gruß Biber
Member: miniversum
miniversum Dec 20, 2006 at 18:47:02 (UTC)
Goto Top
set wert=!wert:~0,-%wortlaenge%!
Brauchst du das enableDelayedExpansion überhaubt??

miniversum
Member: BatzJunior
BatzJunior Dec 20, 2006 at 20:11:43 (UTC)
Goto Top
..leider ja, denn sonst wird %wortlaenge% nicht ausgewertet bevor die Zuweisung für %wert% geschieht...

Gruß, Daniel
Member: BatzJunior
BatzJunior Dec 20, 2006 at 20:39:32 (UTC)
Goto Top
Hi Biber,

leider funktioniert Deine Variante nicht face-sad Noch irgend eine andere Idee?

Danke, Daniel
Member: miniversum
miniversum Dec 20, 2006 at 20:57:02 (UTC)
Goto Top
Idee:
Schreib wert in ne Datei, mach dann dein endlocal und ließ danach wert wieder ein.
Doofer Umweg aber geht.

mniversum
Member: Biber
Biber Dec 20, 2006 at 23:50:05 (UTC)
Goto Top
Moin BatzJunior,
Noch irgend eine andere Idee?

Kennst Du jemanden in diesem Forum, der sich daran erinnern kann, dass mir mal Ideen ausgegangen wären? face-wink

Wenn die DelayedExpansion bei Dir unter Umständen Probleme macht ( z.B. wegen Ausrufungszeichen im String), dann meide sie doch ganz.
Lässt sich ja immer selbst nachbilden.
Wenn ich es richtig verstanden habe und die Soll-Länge auf jeden Fall kürzer oder gleich der momentanen Länge des Strings ist, dann reicht doch folgendes:

:: ----snipp CutItDemo.bat
@echo off & setlocal
Set /a wortlaenge=8
set "Wert=whateverUwant"   

call:cutit wert "%%wert:~0,%wortlaenge%%%"  
echo Wert[%wert%]
goto :eof

:cutit
Set "%1=%~2  
goto :eof

Demo: der %Wert% "whateverUwant" wird auf 8 Zeichen gekürzt.
>f:\administrator\CutItDemo.bat
Wert[whatever]

Oder, falls jemand eine Batch-Funktion Left.bat braucht:
------- snipp Left.bat Parameter 1=String;  Parameter 2= Soll-Länge
@echo off & setlocal
set "Wert=%1"   
call:cutit wert "%%wert:~0,%2%%"  
echo Left(%1, %2)=[%wert%]
goto :eof

:cutit
Set "%1=%~2  
goto :eof

Demo:
>f:\administrator\Left.bat LangerTestText 8
Left(LangerTestText, 8)=[LangerTe]
HTH Biber
Member: BatzJunior
BatzJunior Dec 21, 2006 at 08:55:00 (UTC)
Goto Top
Hallo Biber,

perfekt, es hat super funktioniert!
Vielen, vielen, lieben Dank! Durch Dich und Deine Hinweise habe ich viel dazugelernt!

Ich wünsche Dir und auch allen anderen Usern ein frohes, besinnliches Weihnachtsfest!

Liebe Grüße,

Daniel