elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Averiguar dia de la semana [Batch]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Averiguar dia de la semana [Batch]  (Leído 31,791 veces)
Shinseiki86

Desconectado Desconectado

Mensajes: 33


Loading...


Ver Perfil
Averiguar dia de la semana [Batch]
« en: 26 Agosto 2009, 17:44 pm »

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:
Código:
[...]
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! ;D


En línea

kevlar

Desconectado Desconectado

Mensajes: 27



Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #1 en: 26 Agosto 2009, 18:03 pm »

Saludos.

Puedes usar el comando AT ve la ayuda en AT /?

Hay una utilidad se llama FDATE te permite efectuar operaciones sobre las fechas. No recuerdo el link.

 :D


En línea

Shinseiki86

Desconectado Desconectado

Mensajes: 33


Loading...


Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #2 en: 26 Agosto 2009, 18:22 pm »

No necesito programar la tarea para su ejecución.

En el ftp, un proveedor guarda los archivos en carpetas con nombre yyyy-mm-dd

Citar
\
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 Desconectado

Mensajes: 33


Loading...


Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #3 en: 26 Agosto 2009, 21:11 pm »

El codigo completo de la funcion qu crea el archivo de configuración para la conexión ftp es:

Código:
:: 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 Desconectado

Mensajes: 27



Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #4 en: 27 Agosto 2009, 16:04 pm »

Holas.

Encontre esta información, espero te sirva.


http://www.paniagua.net/foros/forum_posts.asp?TID=436

En línea

kevlar

Desconectado Desconectado

Mensajes: 27



Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #5 en: 27 Agosto 2009, 16:09 pm »

Aqui esta un ejemplo mas completo


http://www.computerhope.com/forum/index.php?topic=72724.0


En línea

Shinseiki86

Desconectado Desconectado

Mensajes: 33


Loading...


Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #6 en: 27 Agosto 2009, 17:24 pm »

Wow...

Listo.. lo que necesitaría del codigo es:
Código:
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?
Código:
Wd = DatePart("WW"  , Newdate)
Wn = DatePart("Y"   , Newdate)

En estos momentos me arrojan 35 y 239 respectivamente.
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Averiguar dia de la semana [Batch]
« Respuesta #7 en: 27 Agosto 2009, 17:25 pm »

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:
Código:
n=a+31*(m-1)+d/a-1)/4-3*((a+99)/100)/div4
B) Meses restantes:
Código:
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:
Código:
n%=7
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

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #8 en: 27 Agosto 2009, 19:30 pm »

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.

Código:
@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 Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Averiguar dia de la semana [Batch]
« Respuesta #9 en: 27 Agosto 2009, 19:40 pm »

A mi no me había gustado la parte vbs que habías dejado en principio, así que te dejo otro :P

Código
  1. @echo off
  2.  
  3. set fecha="2009-08-27"
  4. REM Se le pasa una fecha con formato YYYY-MM-DD y devuelve el dia
  5. REM de la semana, donde el lunes es el primer dia y domingo el ultimo
  6.  
  7. set vbsfile=%temp%\newdate.vbs
  8. echo fecha = %fecha% > %vbsfile%
  9. echo dias = array("Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo") >> %vbsfile%
  10. echo mad = split(fecha,"-") >> %vbsfile%
  11. echo wscript.echo dias(weekday(mad(2) ^& "/" ^& mad(1) ^& "/" ^& mad(0) ,vbmonday)-1) >> %vbsfile%
  12.  
  13. for /f %%A in ('cscript.exe //nologo %vbsfile%') do set diasemana=%%A
  14. echo %diasemana%

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa para averiguar el dia de la semana
Programación C/C++
Caster 4 2,356 Último mensaje 18 Julio 2013, 16:34 pm
por Caster
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines