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.
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
Please also mark the comments that contributed to the solution of the article
Content-ID: 102187
Url: https://administrator.de/contentid/102187
Printed on: December 5, 2024 at 22:12 o'clock
7 Comments
Latest comment
Hallo Ren!
Insgesamt könnte der mir bekannte Teil Deines Batches dann etwa so aussehen:
Grüße
bastla
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 zBcall :handledir "%dir1%"
@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
bastla