Autor
|
Tema: Averiguar dia de la semana [Batch] (Leído 32,850 veces)
|
Shinseiki86
Desconectado
Mensajes: 33
Loading...
|
Hola a todos! Tengo un archivo bat que necesita saber el dia de la semana para poder excluir los sabados y los domingos. El progrma descarga por ftp archivos que estan en carpetas con la estructura yyyy-mm-dd, pero solo dias habiles. Lo uqe hago es: [...] set diaLetras=%date:~0,3% if "%diaLetras%"=="Lun" set /a diaCod=1 if "%diaLetras%"=="Mar" set /a diaCod=2 if "%diaLetras%"=="Mi‚" set /a diaCod=3 if "%diaLetras%"=="Jue" set /a diaCod=4 if "%diaLetras%"=="Vie" set /a diaCod=5 if "%diaLetras%"=="S b" set /a diaCod=6 if "%diaLetras%"=="Dom" set /a diaCod=7 [...]
Esto funciona de maravilla en Win2000... pero en XP no sirve, ya que la %DATE% no muestra el dia de la semana. ¿Que puedo hacer? ¿Hay otra forma? Gracias!
|
|
|
En línea
|
|
|
|
|
Shinseiki86
Desconectado
Mensajes: 33
Loading...
|
No necesito programar la tarea para su ejecución. En el ftp, un proveedor guarda los archivos en carpetas con nombre yyyy-mm-dd \ 2009-08-26 2009-08-25 2009-08-24 ...
Tengo un bat que ingresa a cada carpeta y me descarga los archivos que tiene cada carpeta solo de los 10 ultimos dias habiles (excluyo los sabados y los domingos). la idea es hacerlo solo con variables de bat, o en últimas de vbs, pero sin instalar programas.
|
|
« Última modificación: 26 Agosto 2009, 21:03 pm por Shinseiki86 »
|
En línea
|
|
|
|
Shinseiki86
Desconectado
Mensajes: 33
Loading...
|
El codigo completo de la funcion qu crea el archivo de configuración para la conexión ftp es: :: Configuración FTP if not defined countstop ( @echo off cls cd /d C:\ echo Establezca contador de parada: set /p countstop=" >" )
:configftp echo open XXX.XX.XXX.XXX>conexionFTP.txt echo XXXXXXXX>>conexionFTP.txt echo XXXXXXXX>>conexionFTP.txt echo debug>>conexionFTP.txt echo hash>>conexionFTP.txt echo ascii>>conexionFTP.txt echo lcd descargado>>conexionFTP.txt echo.>>conexionFTP.txt echo bell>>conexionFTP.txt
:: Configuracion de las carpetas a verificar en el ftp. set /a count=1 :: En winXP no es posible determinar el dia de la semana. ¿o si? :setdia set diaLetras=%date:~0,3% if "%diaLetras:~-1%"=="/" ( cls echo ---^> echo ---^> El sistema no puede controlar los dias. echo ---^> Indique el dia actual: Lun=1 a Dom=7 set /p diaCod="---> " call:verificadia goto setdiaok ) else ( :: En win2000 si se puede. if "%diaLetras%"=="Lun" set /a diaCod=1 if "%diaLetras%"=="Mar" set /a diaCod=2 if "%diaLetras%"=="Mi‚" set /a diaCod=3 if "%diaLetras%"=="Jue" set /a diaCod=4 if "%diaLetras%"=="Vie" set /a diaCod=5 if "%diaLetras%"=="S b" set /a diaCod=6 if "%diaLetras%"=="Dom" set /a diaCod=7 goto setdiaok ) :verificadia if %diaCod% GEQ 1 if %diaCod% LEQ 7 goto:EOF else ( echo ---^> Error! Dia inexistente! El programa se cerrar . pause>nul exit ) :: ********************************************************** :setdiaok ::año actual set anno=%date:~-4% ::mes actual if %date:~-7,1% EQU 0 (set /a mesNum=%date:~-6,1%) else (set /a mesNum=%date:~-7,2%) if %mesNum%==1 set mesCarpeta=01-Enero if %mesNum%==2 set mesCarpeta=02-Febrero if %mesNum%==3 set mesCarpeta=03-Marzo if %mesNum%==4 set mesCarpeta=04-Abril if %mesNum%==5 set mesCarpeta=05-Mayo if %mesNum%==6 set mesCarpeta=06-Junio if %mesNum%==7 set mesCarpeta=07-Julio if %mesNum%==8 set mesCarpeta=08-Agosto if %mesNum%==9 set mesCarpeta=09-Septiembre if %mesNum%==10 set mesCarpeta=10-Octubre if %mesNum%==11 set mesCarpeta=11-Noviembre if %mesNum%==12 set mesCarpeta=12-Diciembre ::dia actual if %date:~-10,1% EQU 0 (set /a diaFecha=%date:~-9,1%) else (set /a diaFecha=%date:~-10,2%)
:: ************************************************************************************* SetLocal EnableDelayEdexpansion :bucle :: Contador. Si count es mayor o igual a countstop, se sale del bucle. if %count% GTR %countstop% goto finbucle :: ************************************************************************** :: Determina si se acabó la semana. Además me excluye los dias no habiles if %diaCod%==0 (set /a diaCod=5) & (set /a diaFecha=diaFecha-2) & (goto bucle) if %diaCod%==6 (set /a diaCod=5) & (set /a diaFecha=diaFecha-1) & (goto bucle) :: esto evalua si se acabaron los dias. Se debe empezar con el mes siguiente if %diaFecha% LSS 1 ( if %mesNum%==1 (set /a mesNum=12) & (set /a anno-=1) else (set /a mesNum-=1) if !mesNum!==1 (set /a diaFecha=31) :: problemas cuando sea año bisiesto if !mesNum!==2 (set /a diaFecha=28) if !mesNum!==3 (set /a diaFecha=31) if !mesNum!==4 (set /a diaFecha=30) if !mesNum!==5 (set /a diaFecha=31) if !mesNum!==6 (set /a diaFecha=30) if !mesNum!==7 (set /a diaFecha=31) if !mesNum!==8 (set /a diaFecha=31) if !mesNum!==9 (set /a diaFecha=30) if !mesNum!==10 (set /a diaFecha=31) if !mesNum!==11 (set /a diaFecha=30) if !mesNum!==12 (set /a diaFecha=31) ) :: ************************************************************************** ::Variables para imprimir en el archivo de configuración ::mes a imprimir if %mesNum% LSS 10 (set mes=0%mesNum%) else (set mes=%mesNum%) ::dia a imprimir if %diaFecha% LSS 10 (set dia=0%diaFecha%) else (set dia=%diaFecha%) ::campanazo de ultima carpeta if %count% EQU %countstop% echo bell>>conexionFTP.txt ::titulo de la ventana call:title echo cd %anno%-%mes%-%dia%>>conexionFTP.txt echo mget *_I*>>conexionFTP.txt echo cd ..>>conexionFTP.txt ::campanazo de primer carpeta if %count%==2 echo bell>>conexionFTP.txt echo.>>conexionFTP.txt set /a diaFecha-=1 set /a count+=1 set /a diaCod-=1 :: **************************************************************************** goto bucle EndLocal :title ::******************************************************* :: Inserta Titulo de ventana entre cada carpeta del FTP SetLocal DisableDelayEdexpansion echo !title %anno%-%mes%-%dia% (%count% de %countstop%)>>conexionFTP.txt goto:EOF ::******************************************************* :finbucle
echo bye>>conexionFTP.txt echo ---^> Configuraci¢n FTP terminada. goto:EOF
El problema lo tengo en la etiqueta setdia. La unica solucion fue que el usuario ingresara el dia manualmente, pero la idea es que el proceso se ejecute en un servidor.
|
|
|
En línea
|
|
|
|
kevlar
Desconectado
Mensajes: 27
|
|
|
|
En línea
|
|
|
|
kevlar
Desconectado
Mensajes: 27
|
|
|
|
En línea
|
|
|
|
Shinseiki86
Desconectado
Mensajes: 33
Loading...
|
Wow... Listo.. lo que necesitaría del codigo es: set vbsfile=%temp%\newdate.vbs echo Newdate = (Date())>%vbsfile% echo Yyyy = DatePart("YYYY", Newdate)>>%vbsfile% echo Mm = DatePart("M" , Newdate)>>%vbsfile% echo Dd = DatePart("D" , Newdate)>>%vbsfile% echo Wd = DatePart("WW" , Newdate)>>%vbsfile% echo Wn = DatePart("Y" , Newdate)>>%vbsfile% echo Ww = Datepart("W" , Newdate)>>%vbsfile%
echo Wscript.Echo Yyyy^&" "^&Mm^&" "^&Dd^&" "^&Wd^&" "^&Ww^&" "^&Wn>>%vbsfile% for /F "tokens=1-6 delims= " %%A in ('cscript //nologo %vbsfile%') do (set weekday#=%%E)
Es perfecto... aunque la semana iniciaría el domingo... solo sería cambiarle unas cuantas cosas al bat... ¡Gracias kevlar! Pero tengo una duda... Las variables Wd y Wn... ¿que son? Wd = DatePart("WW" , Newdate) Wn = DatePart("Y" , Newdate)
En estos momentos me arrojan 35 y 239 respectivamente.
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Mmmmmm, creo que podrías usar un VBS, así te ahorras bastante trabajo que sería en Batch. Edito : Ya vi que lo resolviste, que bien. Hay 2 formulas generales para sacar el día de la semana. A) De meses de enero a febrero: n=a+31*(m-1)+d/a-1)/4-3*((a+99)/100)/div4 B) Meses restantes: n=a+31*(m-1)+d(-(4*m+23)/10+a/4-(3*(a/100+1))/4 Donde a = año, m = mes, d = dia. Cuando hayas hecho los cálculos, haces: Y te dará el numero de día de la semana. Como ves, es algo engorroso.
|
|
« Última modificación: 27 Agosto 2009, 17:29 pm por Leo Gutierrez. »
|
En línea
|
|
|
|
0x0309
Desconectado
Mensajes: 215
|
Mira, consultando la wikipedia hice este código, a lo mejor te sirve. Nota: Si mal no recuerdo, en windows vista, está el comando forfiles (correción: es robocopy), que en la ayuda te muestra la fecha, así es que para ese sistema operativo, podrías parsear con for /f. Nota, utilicé el código de Herbert Kleebauer, para extraer la fecha, para que no tengas problemas, debido a que hay distintos formatos de fecha de acuerdo a la configuración regional. Modificación: :diaFecha estaba mal. La he actualizado. @echo off
call :extFecha call :diaSemana %d% %m% %y% for /f "tokens=%errorlevel%" %%d in ( "Lunes Martes Miercoles Jueves Viernes Sabado Domingo") do echo.Es: %%d pause goto :eof
:diaSemana ::Basado en el algoritmo de Tomohiko Sakamot ::Retorn 1 Monday, 7 Sunday setlocal enableextensions disabledelayedexpansion for /f "tokens=* delims=0 eol=0" %%d in ("%~1") do set /a "d=%%d" for /f "tokens=* delims=0 eol=0" %%m in ("%~2") do set /a "m=%%m" set /a "y=%~3" for /f "tokens=%m%" %%t in ( "0 3 2 5 0 3 5 1 4 6 2 4") do set /a "t=%%t" if %m% lss 3 (set /a y-=1) set /a "dw=(y+y/4-(y/100)+(y/400)+t+d)%%7" if %dw% equ 0 (set /a dw=7) exit /b %dw%
:extFecha :: extract day month and year of the current date :: Adapatacion del code de Herbert Kleebauer :: Este codigo sirve para extraer en tres variables el contenido de la fecha :: y que sea compatible con las distintas configuraciones regionales. :: Retorna variables d,m,y que corresponden a dia mes año setlocal enableextensions set "date=" pushd "%Temp%" :loop set d="%date%" echo.>_._ if not %d%=="%date%" goto :loop for /f "tokens=1-3 delims=0123456789 " %%i in ( "%date%") do set d=%%i%%j%%k for /f "tokens=1-3 delims=%d% " %%i in ( "%date%") do set /a d=1%%i,m=1%%j,y=1%%k if %d% gtr %m% ( set d=%m% set m=%d%) if %m% gtr %y% ( set m=%y% set y=%m%) if %d% gtr %m% ( set d=%m% set m=%d%) set /a d=%d%-100,m=%m%-100,y=%y%-10000 if %d% gtr 12 goto :eFEof if %d% equ %m% goto :eFEof if %m% gtr 12 ( set m=%d% set d=%m% goto :eFEof) xcopy /l /d:%m%-%d%-%y% _._ \|find "_._" >nul if errorlevel 1 goto :l1 xcopy /l /d:%d%-%m%-%y% _._ \|find "_._" >nul if not errorlevel 1 goto :eFEof :l1 (set m=%d% set d=%m%) :eFEof del _._ popd ( endlocal set y=%y% set m=%m% set d=%d% ) setlocal enableextensions && goto :Eof
|
|
« Última modificación: 6 Septiembre 2009, 23:10 pm por 0x0309 »
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
A mi no me había gustado la parte vbs que habías dejado en principio, así que te dejo otro REM Se le pasa una fecha con formato YYYY-MM-DD y devuelve el dia REM de la semana, donde el lunes es el primer dia y domingo el ultimo set vbsfile= %temp%\newdate.vbs echo fecha = %fecha% > %vbsfile% echo dias = array ("Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo" ) >> %vbsfile% echo mad = split (fecha,"-" ) >> %vbsfile% echo wscript. echo dias (weekday (mad (2 ) ^& "/" ^& mad (1 ) ^& "/" ^& mad (0 ) ,vbmonday )-1 ) >> %vbsfile% for /f %%A in ('cscript.exe //nologo %vbsfile%' ) do set diasemana= %%A
Saludos
|
|
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
|
|