2009-06-01 14 views
8

hola tengo un archivo por lotes, algo como esto:sólo lo hacen si el archivo por lotes días ...

if %day%==monday, tuesday, wednesday, thursday, friday (
goto yes 
) else (
goto no 
) 

ahora sé la primera línea no funcionará.

lo que realmente quiere que suceda:

comprueba automatticly qué día es. Si es de lunes a viernes, tiene que ir a 'sí', de lo contrario (sábado/domingo) a 'no'.

¿Cómo hacer esto?

Respuesta

5

Me encontré con esto en línea. Probado, y funciona. Devuelve el día como un entero, con el que aún puede trabajar.

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A 
    Set Day=%%B 
    Set Year=%%C 
) 

@echo DAY = %Day% 
@echo Month = %Month% 
@echo Year = %Year% 
+1

Tenga en cuenta que esto no funcionará en configuraciones regionales donde el separador de fecha no es/ – laalto

+2

Esto no será una solución confiable, ya que cuando uso 'date/t' aquí, todo lo que obtengo es el corto (YYYY-MM-DD), por lo tanto, sin nombre de día. Va con los locales. Si esto es para exportación (cualquiera que no sea usted), no apostaría a que esto funciona como se esperaba. – Jay

0
IF %day% == monday GOTO YES 
IF %day% == tuesday GOTO YES 
IF %day% == wednesday GOTO YES 
IF %day% == thursday GOTO YES 
IF %day% == friday GOTO YES 
GOTO NO 
+1

¿realmente lo hace solo, o tiene que escribirlo el usuario? –

+2

¿Quién está configurando% día%? – criddell

+0

Supuse% day% ya estaba configurado y él no entendía completamente la ramificación. – Randolpho

0

no tengo la fu por lotes para responder a la pregunta que le preguntó, pero, suponiendo que esto es un archivo por lotes de Windows, considere la posibilidad de ejecutar la secuencia de comandos mediante el programador de tareas, lo que le permitirá establecer el tipo de horario estás pidiendo

+0

te entiendo, pero también tengo que dar un tiempo específico. el archivo BATCH solo se ejecutará al inicio. –

+0

Puede configurar un disparador en el Programador de tareas para ejecutar "Al inicio" o "Al iniciar sesión". No tiene que tener un tiempo específico. –

9

Aquí hay un ejemplo de archivo bat que hará este tipo de cosas, estoy seguro de que puede pensar en otras formas de utilizar este código de muestra. Por ejemplo, cada vez que necesita una lista "en". El truco es el% date: ~ 0,3% esto indica expandir la variable de entorno% date% y comenzar en la posición 0 al comienzo de la cadena devolver los siguientes 3 caracteres. Puedes aprender más sobre esto desde el "set /?" mando.

ejemplo: IsWeekDay.bat

@echo off 
setlocal 

for %%i in (Mon,Tue,Wed,Thu,Fri) do (
    if "%date:~0,3%"=="%%i" goto YES 
) 

:NO 
echo No 
goto EOF 

:YES 
echo Yes 

:EOF 
endlocal 
+1

hmm ... esto no parece funcionar para mí. –

+0

+1 Excelente. Funciona en Window7 para mí. @YourComputerHelpZ puede% date% desde la línea de comando y también date/t. ¿Puedes decirnos qué obtienes? –

5

Como Jay ha mencionado, utilizando date /t sólo funcionará en lugares donde las salidas esta orden el día de la semana junto con la fecha, y no funcionará en otra locales (por ejemplo, ruso). Si no le molesta mezclar sus archivos por lotes con algún VBScript, aquí hay una solución que debería funcionar en todas las configuraciones regionales.

El truco es este pequeño script de VBScript que da salida el día de la semana como un número (1 = domingo, 2 = Lunes, ... 7 = Sábado):

WScript.Echo DatePart("w", Date) 

Puede ejecutar este script de su archivo por lotes, lea su producción y aplicar su lógica:

for /f %%d in ('cscript dayofweek.vbs //nologo') do (
    if %%d==7 goto no :: Saturday 
    if %%d==1 goto no :: Sunday 
) 
goto yes 
0

Aquí es un archivo por lotes que extrae los días de la semana, día, mes y año de una manera casi locale-neutro.

La única cosa específica de la configuración regional es la ortografía del día de la semana, el resto es el lugar neutral.

En inglés, devolverá Thu para el jueves, pero en holandés será do (para donderdag).

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi 
:: Works on any NT/2k machine independent of regional date settings 
:: 
:: 20110103 - adapted by [email protected] for Dutch locale 
:: 20110303 - adapted by [email protected] for day-of-week 
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy' 
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date 
::   set '%%c'=%%k 
::   set 'yy'=%%k 
:: 
:: Also, in Dutch, there is a difference between %date% and date/t: the former will not include 
:: the day-of-the-week, but the latter will. 
:: That means the if "%date%A" LSS "A" trick does not work with %date%, we need a loop 
:: to check if the day-of-the-week needs us to take tokens 2-4 in stead of 1-3: 
::  if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4) 
::  for /f "tokens=1" %%t in ('date/t') do (...) 
:: 
:: Another difference between Dutch and English is that the Dutch date/t will prepend the day of the week in a lower case 2-letter form. 
:: So the LSS "A" trick needs to be replaced with an LSS "a" trick 
::  if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4) 
::  if "%%ta" LSS "a" (set toks=1-3) else (set toks=2-4) 
:: 
:: In addition, date will display the current date before the input prompt using dashes 
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch 
:: and one occurence in English. 
:: This skips the first iteration: 
::  if "%%a" GEQ "A" 
:: 
:: echo:^|date 
:: Huidige datum: ma 03-01-2011 
:: Voer de nieuwe datum in: (dd-mm-jj) 
:: The current date is: Mon 01/03/2011 
:: Enter the new date: (mm-dd-yy) 
:: 
:: date/t 
:: ma 03-01-2011 
:: Mon 01/03/2011 
:: 
:: The assumption in this batch-file is that echo:^|date will return the date format 
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token. 
:: 
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens. 
:: That will resolve the order of the tokens. 
:: 
@ECHO off 
    set v_day_of_week= 
    set v_day= 
    set v_month= 
    set v_year= 

    SETLOCAL ENABLEEXTENSIONS 
     for /f "tokens=1" %%t in ('date/t') do (
     set v_day_of_week=%%t 
     if "%%ta" LSS "a" (set toks=1-3) else (set toks=2-4) 
    ) 
::DEBUG echo toks=%toks% 
     for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a 
     if "%%a" GEQ "A" (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
      set '%%a'=%%i 
      set '%%b'=%%j 
      set 'yy'=%%k 
     ) 
     ) 
    ) 
     if %'yy'% LSS 100 set 'yy'=20%'yy'% 
     set Today=%'yy'%-%'mm'%-%'dd'% 

    ENDLOCAL & SET day_of_week=%v_day_of_week% & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'% 

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%] 
    set datestring=%V_Year%%V_Month%%V_Day% 
    echo %datestring% 
    echo day of week=%day_of_week% 

    :EOF 

Have fun with it!

--jeroen

0

De this answer, tenemos

wmic path win32_localtime get dayofweek 

Ampliando esta basado en sugerencias en this thread, podemos establecer una variable dayofweek de la siguiente manera:

@echo off 
REM Unset dayofweek in case set in a previous execution of this batch file 
set dayofweek= 
REM Get dayofweek into a variable. Locale-specific: 0 is either Sunday or Monday. 
for /F "skip=1 tokens=*" %%a in ('wmic path win32_localtime get dayofweek') do if not defined dayofweek set dayofweek=%%a 
echo %dayofweek% 

Tenga en cuenta que 0 puede ser domingo o lunes dependiendo de su localidad.

Cuestiones relacionadas