Encontrando o dia da semana no arquivo de lote? (Windows Server 2008)

6

Eu tenho um processo que eu executo a partir de um arquivo de lote, e eu só quero executá-lo em um determinado dia da semana.
É possível obter o dia da semana?

Todo o exemplo que encontrei, de alguma forma, depende de "date / t" para retornar "Friday, 12/11/2009", no entanto, na minha máquina, "date / t" retorna "12/11/2009". Nenhum dia da semana lá.

Já verifiquei as "configurações regionais" da minha máquina e o formato de data por extenso inclui o dia da semana. O formato de data abreviada não, mas eu realmente prefiro não mudar isso, pois isso afetará um monte de coisas que eu faço.

    
por Daniel Magliola 16.12.2009 / 06:41

18 respostas

-2

Ok, encontrei uma resposta ...
Não consegui encontrar uma maneira de usar arquivos BAT simples, mas se você tiver acesso ao PowerShell ...

@echo off
powershell date > date.txt
find/i "Fri" date.txt  > nul
if errorlevel 1 goto SkipWeeklyTasks

Do your weekly stuff here

:SkipWeeklyTasks
del date.txt

Espero que ajude ...

EDIT: (para pessoas em potencial tropeçando nisso) Isso é desagradável e feio, e não deve ser feito, e outras respostas a esta pergunta são melhores, se elas se aplicam a você. Se você PRECISAR de fazer isso rapidamente e sujar dentro de um arquivo de lote que você já tenha, isso pode funcionar para você, no entanto.

Daniel

    
por 16.12.2009 / 07:00
9

Estou um pouco atrasado para esta festa, mas isso lhe dará o dia da semana:

wmic path win32_localtime get dayofweek

Use um loop de lote para obter a saída e você terá uma condição testável para o dia da semana.

Rob

    
por 19.04.2010 / 22:21
5

Aqui está um arquivo em lote que irá obter todas as informações de data e hora em variáveis, mas isso depende de você ter um formato de data apropriado definido em sua máquina. Além disso, o pedido pode precisar de ajustes, dependendo do formato de data local, não tenho certeza.

@echo off
for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (
set WD=%%i
set D=%%j
set M=%%k
set Y=%%l
) 

for /F "tokens=1-4 delims=: " %%i in ('time /t') do (
set H=%%i
set Mn=%%j
set AP=%%k
)

if "%AP%"=="PM" set /A H=%H%+12

echo %WD% %D%/%M%/%Y% - %H%:%Mn%

O bit que você quer está em% WD%.

    
por 20.04.2010 / 00:25
4

O lote não pode fazer isso facilmente. Requer muita linha de comando com o comando date. Existem algumas maneiras de conseguir o que você procura, mas acima de tudo, estou me perguntando por que o Agendador de Tarefas integrado não é uma opção? Ele permite que você especifique os dias que deseja que sejam executados e a que horas:

texto alternativo http://i46.tinypic.com/140jm6o.png

Você também pode usar o VBScript:

wscript.stdout.writeline weekdayname(weekday(date))

Em seguida, execute:

C:\Documents and Settings\Administrator>cscript /nologo dayofweek.vbs
Wednesday

Você pode facilmente usar lógica if / else no VBScript e, em seguida, fazer com que o seu código VBScript execute arquivos em lote, dependendo do dia, e vice-versa (chamar em lote um VBScript).

    
por 16.12.2009 / 07:01
1

Posso citar algo que encontrei na net:

About the DOW problem...

Win 2000 displays the current date by heading with the Day of Week, but Win XP gives you the bare date in your country format without DOW. This is one of the little annoiances affecting the two (almost) brothers operating sysyems.

To work around the trick is to force the legacy format displayed by (emulated) DOS

Echo.|Command /C Date|Find "current"

Isso realmente funciona, agora você só precisa pegar o DOW fora da saída e pronto ...

    
por 16.12.2009 / 11:05
1

Na verdade, o sinalizador para isso (2K8, 2K3, XP, etc.) é o formato de data SHORT.

Abaixo das opções regionais e de idioma - clique no botão Personalizar Na guia DATA   Altere o formato SHORT Date para "M / d / yyyy"   Alterar o formato da data LONG para "dddd, dd MMM, aaaa"

Em seguida, o dia da semana aparece - para testar isso, execute isso em um prompt do DOS: data / t A saída deve ser assim "seg 01/31/2011"

    
por 31.01.2011 / 18:15
1

Caso alguém precise, isso funciona para mim no Windows 7 e XP ...

echo.|command /C date|find /i "current" >%temp%\dow.txt
for /f "tokens=1-4 delims=/ " %%i in (%temp%\dow.txt) do set DOW=%%l
echo %DOW%

Para o Windows Server 2008, eu usaria um dos métodos Powershell sugeridos acima.

    
por 29.09.2011 / 17:11
1

Para evitar redirecionar a um arquivo de texto, há uma variação de o FOR que leva uma string de comando. Aqui está:

@For / F "tokens = 4 delims = / -"% i In ('@Echo.^|Comando / C Data ^ | Localizar / i "atual" ') Fazer @Echo% i

Lembre-se de usar sinais de porcentagem dupla se você colocar este comando em um script dos. No meu exemplo, verifiquei o caractere delimitador de data comum de barra ou traço.

Eu prefiro esta solução, pois é somente DOS sem ter que depender se o WMI, PowerShell, etc está presente ou não.

    
por 24.02.2012 / 14:59
1

Que tal este para o Windows 2008, muito mais elegante. Também funcionará em qualquer lugar onde o powershell estiver instalado.

@for /F "tokens=1 delims=, " %%i In ('powershell date') do set dow=%%i
echo %dow%
    
por 12.06.2012 / 18:19
1

Graças à postagem anterior do Phil Swiss - isso funciona bem:

echo. | cmd /C date | find "current"

Uso de exemplos:

echo. | cmd /C date | find /i "Fri" && echo today is Friday

Ou para reverter:

echo. | cmd /C date | find /i "Fri" || echo today is NOT Friday

    
por 22.06.2012 / 10:52
1
@echo off

:set the variables
for /f %%C in ('wmic path Win32_LocalTime Get Year^,Month^,Day^,Hour^,Minute^,Second /Format:List 2^>nul ^| find "="') do @set current%%C

:display the variables
set current

Agora tudo o que resta é pré-pendurar zeros no dia e no mês se qualquer um deles for menor que 10.

    
por 03.07.2012 / 22:12
1

Aqui está a resposta correta para um script BAT em um sistema moderno:

@echo off
for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i
echo %dow%

Saídas:

Saturday

Uso:

@echo off
for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i
if %dow% == Saturday goto shutdown
if %dow% == Sunday goto shutdown
exit

:shutdown
shutdown /s /f /t 90

Eu usei isso para PCs que são auto-boot diariamente da BIOS, que não tem uma opção para excluir fins de semana.

Além disso: ACPI é uma maneira mais confiável de fazer isso, e permite que um script BAT fictício como exit seja usado em uma Tarefa Agendada do Windows com dias específicos selecionados, usando o Wake the computador para executar esta tarefa .

    
por 09.05.2015 / 17:21
1

Isso pode ser feito com um cálculo simples

 ::get dow number (1=monday) from dd mm yy 
 set/a a=(14-mm)/12,yr=yy-a,m=mm+12*a-2,"dow=(dd+yr+yr/4-yr/100+yr/400+31*m/12)%%7"
    
por 25.05.2016 / 15:30
1

Minha resposta é baseada na resposta de RobW, mas ele simplesmente ecoa o dia da semana, enquanto a questão era como mudar o curso do script dependendo do dia da semana (exatamente o que eu queria fazer também). Bem, acabou por ser menos simples do que parece, porque de alguma forma o FOR loop obtém duas linhas para processar em vez de uma, e a segunda (que parece estar vazia) quebra a execução do script.

O único loop FOR que realmente funcionou para mim sem interromper a execução é o seguinte:

for /F "skip=1" %%I in ('wmic path win32_localtime get dayofweek') do (set /a dow=%%I 2>NUL)
if %dow% geq 6 goto ok
echo You can run this script only on Saturday or Sunday
goto :eof
:ok
REM do more stuff here

A parte 2>NUL suprime o erro que seria mostrado durante a segunda atribuição, enquanto /a lida com o espaço que é adicionado devido ao redirecionamento.

    
por 22.11.2018 / 14:12
0

Eu estou nos EUA. Eu posso executar esse código no Windows 7, no Windows 2008 R2, no Windows Server 2003, no Windows XP (todos os sistemas operacionais estão atualizados com as atualizações e patches do Windows). Tudo com configuração de data abreviada sem ddd (ou dddd) (dia da semana).

@echo off
for /f %%a in ('date /t') do set DAY=%%a
echo.
echo The Day Is: %DAY%
echo.

Se hoje for quinta-feira, o resultado será "The Day Is: Thu".

Isso retorna o dia nas 4 versões do Windows nas quais testei. E apenas o dia. Quando mudei minha configuração de data abreviada para "ddd, M / d / aaaa", minha saída mostraria o dia com uma vírgula (por exemplo, Thu), o que indica que esse código usa o formato de data abreviada. Mas o que também pode estar acontecendo é que, se a data abreviada não contiver o dia da semana, pode parecer que o formato de data longo, em todas as 4 máquinas que testei, tenha dddd no formato.

    
por 06.02.2014 / 19:30
0
ECHO: I needed a more comprehensive solution using an array.
@ECHO OFF
setlocal EnableDelayedExpansion

ECHO :: Get DayOfWeek
ECHO :: Will return DayOfWeek=#
ECHO :: 
For /F "tokens=1 delims=| " %%a In ( 'wmic path win32_localtime get dayofweek /Value^|Find "DayOfWeek"' ) Do (
  Echo %%a
  set "str=%%a"
  ECHO :: Remove DayOfWeek=
  set "str=!str:~10,1!"
  ECHO !str!
)
ECHO.
ECHO :: Create vector with names of days (Index of Days)
for %%d in (Monday Tuesday Wednesday Thrusday Friday Saturday Sunday) do (
  set /A i=i+1
  set day[!i!]=%%d
  if !i!==!str! (
    ECHO :: If today what DayOfWeek is it?
    ECHO %%d
  )
)
ECHO :: 
ECHO.
ECHO :: This is how we get the value outside the loop
set index=!str!
echo(!day[%index%]! 
ECHO.
PAUSE
    
por 28.03.2017 / 17:02
-2

Eu uso ...

for /f %i in ('cmd /c wmic path win32_localtime get dayofweek^|findstr [0-9]') do set dayofweek=%i

... para obter o número do dia atual.

    
por 13.01.2015 / 08:55
-2
for /f "skip=1" %%a in ('WMIC Path win32_LocalTime Get DayOfWeek') do if not defined dayNumber set dayNumber=%%a
    
por 24.02.2017 / 09:18