Autor
|
Tema: [batch] Error con For y Do (Leído 3,775 veces)
|
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 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
|
|
« Última modificación: 4 Marzo 2009, 19:14 pm por Sk9ITk5Z »
|
En línea
|
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
|
|
|
0x0309
Desconectado
Mensajes: 215
|
@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
|
|
« Última modificación: 27 Julio 2009, 07:46 am por 0x0309 »
|
En línea
|
|
|
|
Sk9ITk5Z
|
y todo ese codigote hace lo mismo que el mio???????
|
|
|
En línea
|
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
|
|
|
0x0309
Desconectado
Mensajes: 215
|
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.
|
|
« Última modificación: 4 Marzo 2009, 21:58 pm por 0x0309 »
|
En línea
|
|
|
|
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?????
|
|
|
En línea
|
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
|
|
|
0x0309
Desconectado
Mensajes: 215
|
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.
|
|
« Última modificación: 5 Marzo 2009, 17:46 pm por 0x0309 »
|
En línea
|
|
|
|
Sk9ITk5Z
|
entonces toda gira alrededor del for, me quedo bien entendido gracia man
|
|
« Última modificación: 6 Marzo 2009, 18:42 pm por Sk9ITk5Z »
|
En línea
|
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
|
|
|
|
|