ren
Goto Top

Problem mit setlocal enableDelayedExpansion

Ich wollte für eine Batch die Übergabeparameter etwas aufarbeiten. Dabei kommen mehr als 9 vor, und ich muss sie in Verzeichnisse, Dateien, und normalen Text unterscheiden, für jeden dieser Parametertypen soll dann etwas andres getan werden. Das funktioniert soweit auch alles gut.
Nachdem Parametercount durchlaufen ist, habe ich die Werte parametercount, filecount und dircount, dadurch weiß ich, wie viele Dateien und Verzeichnisse ich übergeben habe, und dann Variablen nach dem Muster file1, file2, ... und dir1, dir2, .... Jetzt möchte für diese Variablen etwas machen, bis her sind mir da nur diese for-schleifen eingefallen, für die ich "setlocal enabledelayedexpansion" brauche. Da aber in Dateinamen ! erlaubt sind, geht das schief. Gibt es da eine Möglichkeit, wie ich um "setlocal enabledelayedexpansion" herumkomme? Ich muss übrigens den Umweg über die Variablen nehmen, da ich erst mit den Verzeichnissen etwas machen muss, dann mit den Dateien, und dann wieder mit den Verzeichnissen. Die Übergabeparameter sind auch nicht zwangsläufig sortiert oder so.
call :getparameter %*
setlocal enabledelayedexpansion
for /L %%i in (1,1,%dircount%) do call :handledir "!dir%%i!"  
for /L %%i in (1,1,%filecount%) do call :handlefile "!file%%i!"  
for /L %%i in (1,1,%dircount%) do call :handledir2 "!dir%%i!"  

:getparameter
if not defined parmcount set /a parametercount=0
if not defined filecount set /a filecount=0
if not defined dircount set /a dircount=0
if "%~1"=="" goto :eof  
set /a parametercount=%parmcount%+1
set "parameter%parmcount%=%~1"  
if not exist "%~1" shift & goto :getparameter  
if not exist "%~1\*.*" set /a filecount=%filecount%+1  
if not exist "%~1\*.*" set "file%filecount%=%~1"  
if exist "%~1\*.*" set /a dircount=%dircount%+1  
if exist "%~1\*.*" set "dir%dircount%=%~1"  
shift
goto :getparameter

Content-ID: 102187

Url: https://administrator.de/forum/problem-mit-setlocal-enabledelayedexpansion-102187.html

Ausgedruckt am: 23.12.2024 um 16:12 Uhr

bastla
bastla 19.11.2008 um 14:37:40 Uhr
Goto Top
Hallo Ren!

Versuch es so:
for /L %%i in (1,1,%dircount%) do call :handeldir "%%dir%%i%%"
Grüße
bastla

P.S.: In Zeile 9 wäre "defined" noch richtig zu stellen (und ich persönlich würde anstatt "handeldir" eher "handledir" verwenden)...
Ren
Ren 19.11.2008 um 14:52:43 Uhr
Goto Top
danke für die Korrekturen, aber
for /L %%i in (1,1,%dircount%) do call :handle "%%dir%%i%%"  
tut es leider auch nicht. Die %%is werden richtig eingesetzt. Aber statt des Wertes der Variable dir1 wird leider "dir1" an :handledir übergeben.
bastla
bastla 19.11.2008 um 15:00:04 Uhr
Goto Top
Hallo Ren!

Ich hatte das so (mit Erfolg) getestet:
@echo off & setlocal
set "dir1=D:\Test"  
set "dir2=D:\Test\T2"  
for /L %%i in (1,1,2) do call :handledir "%%dir%%i%%"  
goto :eof

:handledir
echo %1
Grüße
bastla
Ren
Ren 19.11.2008 um 15:02:49 Uhr
Goto Top
krass, ich gehe gerade mal in mich...
Ren
Ren 19.11.2008 um 15:11:35 Uhr
Goto Top
Ja, so geht es tatsächlich, ich habe zwar meine Fehler nicht gefunden, aber dank deines Codes, den ich einfach mal 1:1 kopiert habe, ist das Problem gelöst. Vielen Dank! Jetzt geht meine Batch auch mit Dateien und Verzeichnissen, in denen Id ! eingebaut haben. Was genau passiert denn bei diesen doppelten %%-Zeichen?
Danke noch mal, das hier ist das beste Forum!
Biber
Biber 19.11.2008 um 15:28:42 Uhr
Goto Top
krass, ich gehe gerade mal in mich...
Andere dagegen wären jetzt ganz außer sich vor Begeisterung.. face-wink

Mal sehen, wie es ausgeht...
bastla
bastla 19.11.2008 um 15:55:43 Uhr
Goto Top
Hallo Ren!
Was genau passiert denn bei diesen doppelten %%-Zeichen?
Sie werden zu einfachen "%"-Zeichen - wie in Batch eben üblich. Zusammen mit der Auflösung von %%i entsteht dann zB
call :handledir "%dir1%"
Insgesamt könnte der mir bekannte Teil Deines Batches dann etwa so aussehen:
@echo off & setlocal
set /a parametercount=0
set /a filecount=0
set /a dircount=0
call :getparameter %*

for /L %%i in (1,1,%dircount%) do call :handledir "%%dir%%i%%"  
echo ----------
for /L %%i in (1,1,%filecount%) do call :handlefile "%%file%%i%%"  
echo ----------
for /L %%i in (1,1,%dircount%) do call :handledir2 "%%dir%%i%%"  
goto :eof

:getparameter
if "%~1"=="" goto :eof  
set /a parametercount+=1
set "parameter%parametercount%=%~1"  
if not exist "%~1" goto :getnext  
if not exist "%~1\" set /a filecount+=1   
if not exist "%~1\" set "file%filecount%=%~1"   
if exist "%~1\" set /a dircount+=1   
if exist "%~1\" set "dir%dircount%=%~1"   

:getnext
shift
goto :getparameter

:handledir
echo Dir: %1
goto :eof

:handlefile
echo File: %1
goto :eof

:handledir2
echo Dir2: %1
goto :eof
Grüße
bastla