[batch] Error con For y Do

Iniciado por Sk9ITk5Z, 4 Marzo 2009, 18:26 PM

0 Miembros y 1 Visitante están viendo este tema.

Sk9ITk5Z


estoy haciendo un script para crear carpetas de todo el mes con la fecha,  pero hay un pequeño problema, que no crea nada jaajaja :xD
lo del SET FOLDER y MKDIR no esta mal porque lo cale sin el for y si me crea el folder pero al meterlo  al ciclo ya no me hace nada...

:(... dejo el code aver si alguien me puede ayudar...


@echo off
echo                 **********
echo                 *Sk9ITk5Z*
echo ******************************************
echo *    crear carpetas pára respaldos       *
echo *              mensuales                 *
echo ******************************************
echo De cual mes quieres crear las carpetas?
SET /P m=
echo Cuantos dias tiene el mes?
SET /P d=
SET dia=%date:~0,2%
SET mes=%m%
SET año=%date:~6,4%
REM ******ciclo para crear las carpetas********
FOR /L %%i IN (1,1,%d%) DO (
SET FOLDER=%dia%-%mes%-%año%
MKDIR %FOLDER%
)
REM *******termina el ciclo********************
PAUSE
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.

0x0309

#1

@echo off
setlocal enableextensions

:main
(set mes=)
(set anho=)
(set mesanho=)
echo.mes:1 a 12
echo.anho:1980 a 2009
set /p mesanho=mes-anho:
if not defined mesanho (goto :main)
set mesanho | findstr.exe /r "^mesanho=[0-9]*-[0-9]*$" >nul || (echo.formato incorrecto&goto :main)
for /f "tokens=1-2 delims=- eol=" %%^> in ("%mesanho%") do set /a mes=%%^>&set /a anho=%%^?
if %mes% lss 1 (echo.mes no puede ser 0.&goto:main)
if %mes% gtr 12 (echo.mes no puede mayor a 12.&goto:main)
if %anho% lss 1980 (echo.anho no puede ser menor a 1980.&goto:main)
if %anho% gtr 2099 (echo.anho no puede ser mayor a 2099.&goto:main)
set bisiesto=false
set feb=28
if 2 equ %mes% (call :bisiesto %anho%)
if /i %bisiesto%==true (set feb=29)
for /f "tokens=%mes%" %%a in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set limite=%%a
for /l %%d in (1,1,9) do mkdir 0%%d-%mes%-%anho% >nul 2>&1
for /l %%d in (10,1,%limite%) do mkdir %%d-%mes%-%anho% >nul 2>&1
pause
goto :eof

:BISIESTO
::VERSION: 1.7
::$AUTHOR: CARLOS
SETLOCAL
SET BISIESTO=FALSE
SET /A MOD1="%1 %% 4" >NUL 2>&1
SET /A MOD2="%1 %% 100" >NUL 2>&1
SET /A MOD3="%1 %% 400" >NUL 2>&1
IF [%MOD1%]==[0] (IF NOT [%MOD2%]==[0] (SET BISIESTO=TRUE))
IF [%MOD3%]==[0] (SET BISIESTO=TRUE)
ENDLOCAL & SET "BISIESTO=%BISIESTO%"
GOTO :EOF

Sk9ITk5Z

y todo ese codigote hace lo mismo que el mio??????? :huh:
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.

0x0309

#3
disculpa, lo modifiqué y lo dejé cómo tú querías, con solicitud al usuario.
Debes ingresar mes y anho separado por un guión. Ejemplo:
1-2009

No es necesario solicitar la cantidad de días, pues todos los meses tienen la misma cantidad de días todos los años, excepto febrero que tiene 29 si el año es bisiesto.

Puedes ajustar el rango del año, yo lo deje de 1980 a 2099.

Sk9ITk5Z

aver si em doy a enteneder...

cuando corro el script con solo esto: si me cre la carpeta ..

SET FOLDER=%dia%-%mes%-%año%
MKDIR %FOLDER%


pero cuando lo meto en un for no me ahce nada:


FOR /1 IN (1,1,%d%) DO (
SET FOLDER=%dia%-%mes%-%año%
MKDIR %FOLDER%
)


que parte esta mal del for?????
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.

0x0309

#5
Mira, tienes problemas de lógica y de programación batch.
Tu código corregido queda así. Dejo comentado lo antiguo y en rojo los cambios:

@echo off
setlocal enabledelayedexpansion
echo                 **********
echo                 *Sk9ITk5Z*
echo ******************************************
echo *    crear carpetas pára respaldos       *
echo *              mensuales                 *
echo ******************************************
echo De cual mes quieres crear las carpetas?
rem SET /P m=

SET /P mes=

echo Cuantos dias tiene el mes?
rem SET /P d=
rem SET dia=%date:~0,2%
rem esto para que si no lo usas nunca


SET /P dia=

rem SET mes=%m%

SET año=%date:~6,4%
REM ******ciclo para crear las carpetas********
rem FOR /L %%i IN (1,1,%d%) DO
FOR /L %%i IN (1,1,%dia%) DO (
rem SET FOLDER=%dia%-%mes%-%año%
SET FOLDER=%%i-%mes%-%año%
rem MKDIR %FOLDER%
MKDIR !FOLDER!
)
REM *******termina el ciclo********************
PAUSE


Explicación: se renombra la variable m por mes respectivamente, esto es para evitar tener dos variables con el mismo contenido, se borra set dia=%date:~0,2% porque eso no será utilizado, más bien se renombra la variable d por dia.
Ahora, los for realizan la expansión simple de variables cuando leen, y no cuando ejecutan, por eso cuando haces:
SET FOLDER=%dia%-%mes%-%año%
se crea dicha variable, pero cuando haces:
MKDIR %FOLDER%
el for no expande FOLDER porque cuando recién for leyó FOLDER no existía por lo que aunque crees la variable dentro del for, no será expandida porque la expansión simple la realiza cuando leyó y no cuando ejecuta, y aún si la variable FOLDER hubiese existido antes, con MKDIR FOLDER crearías siempre la misma carpeta porque la expandiría solo al leerla.
De todas formas tienes un error de lógica porque cuando haces:
FOR /L %%i IN (1,1,%d%) DO (
SET FOLDER=%dia%-%mes%-%año%
estás siempre creando la misma carpeta en FOLDER por eso:
se reemplaza ese %dia% por %%i

y luego se utiliza expansión retardada (no simple) para que siempre for utilize el valor actual de la variable.
se reemplaza:
MKDIR %FOLDER%
por
MKDIR !FOLDER!

la expansión retardada se activó al principio con SETLOCAL ENABLEDELAYEDEXPANSION


Aún así, yo te escribí por segunda vez tu script (usando expresiones regulares para validar la entrada), no sé si lo habrás visto (actualicé el post largo que dijiste) porque se debe validar las entradas, por ejemplo que realmente escriban números y no letras en la variable mes y año, y que no presionen simplemente enter, porque se pueden producir resultados "catástroficos", por ejemplo si cuando solicita mes presionas enter, y cuando solicita anho pones un numero, por ejemplo 2009, se crearían 2008 carpetas.


Sk9ITk5Z

#6
entonces toda gira alrededor del for, me quedo bien entendido gracia man 
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.