Como obter e exibir a data de ontem?

Eu estou usando o comando date para um script em lote.
Eu estou querendo saber como usar data de comando para obter a data de ontem.

Olhando para a resposta do @JRL … Se for realmente difícil, talvez use o PowerShell e faça algo parecido com o Get-date do Powershell: Como chegar ontem às 22:00 em uma variável?

Você pode ligar para o PowerShell em um arquivo bat assim: Use o morcego para iniciar o script Powershell

Você vai acabar com uma solução de três ou quatro liner ao invés dos 100 ou mais escritos (imaculadamente eu adicionarei) de Rob Van der Woude.

Boa sorte…

O principal perigo com a variável de data é a sensibilidade do código de idioma. Se você tiver o PowerShell disponível (é muito mais comum nos dias de hoje, mesmo nas grandes corporações), então você pode usar o PowerShell para fazer a formatação e envolvê-lo em uma instrução FOR em lotes.

A seguinte linha do PowerShell fará as contas e formatará a data para você:

PowerShell $date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd') 

Você pode então executar isso via FOR para obtê-lo em uma variável de arquivo em lote (lembrando-se de escaping de um monte de caracteres com o símbolo hat ^, e usando o backtick para evitar as citações embutidas): –

 for /f "usebackq" %%i in (`PowerShell $date ^= Get-Date^; $date ^= $date.AddDays^(-1^)^; $date.ToString^('yyyy-MM-dd'^)`) do set YESTERDAY=%%i echo %YESTERDAY% 

Tenho certeza de que alguém com habilidades superiores de programação do PowerShell e do Lote pode reduzir o comando do PowerShell e / ou o número de caracteres de escape para torná-lo mais legível / sustentável.

Toda vez que você ouve lote, pense em Rob Van der Woude. Enfim, aqui está ontem .

Eu encontrei este script para funcionar bem

 @echo off set yyyy= set $tok=1-3 for /f "tokens=1 delims=.:/-, " %%u in ('date /t') do set $d1=%%u if "%$d1:~0,1%" GTR "9" set $tok=2-4 for /f "tokens=%$tok% delims=.:/-, " %%u in ('date /t') do ( for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do ( set %%x=%%u set %%y=%%v set %%z=%%w set $d1= set $tok=)) if "%yyyy%"=="" set yyyy=%yy% if /I %yyyy% LSS 100 set /A yyyy=2000 + 1%yyyy% - 100 set CurDate=%mm%/%dd%/%yyyy% set dayCnt=%1 if "%dayCnt%"=="" set dayCnt=1 REM Substract your days here set /A dd=1%dd% - 100 - %dayCnt% set /A mm=1%mm% - 100 :CHKDAY if /I %dd% GTR 0 goto DONE set /A mm=%mm% - 1 if /I %mm% GTR 0 goto ADJUSTDAY set /A mm=12 set /A yyyy=%yyyy% - 1 :ADJUSTDAY if %mm%==1 goto SET31 if %mm%==2 goto LEAPCHK if %mm%==3 goto SET31 if %mm%==4 goto SET30 if %mm%==5 goto SET31 if %mm%==6 goto SET30 if %mm%==7 goto SET31 if %mm%==8 goto SET31 if %mm%==9 goto SET30 if %mm%==10 goto SET31 if %mm%==11 goto SET30 REM ** Month 12 falls through :SET31 set /A dd=31 + %dd% goto CHKDAY :SET30 set /A dd=30 + %dd% goto CHKDAY :LEAPCHK set /A tt=%yyyy% %% 4 if not %tt%==0 goto SET28 set /A tt=%yyyy% %% 100 if not %tt%==0 goto SET29 set /A tt=%yyyy% %% 400 if %tt%==0 goto SET29 :SET28 set /A dd=28 + %dd% goto CHKDAY :SET29 set /A dd=29 + %dd% goto CHKDAY :DONE if /I %mm% LSS 10 set mm=0%mm% if /I %dd% LSS 10 set dd=0%dd% REM Set IIS and AWS date variables set IISDT=%yyyy:~2,2%%mm%%dd% set AWSDT=%yyyy%-%mm%-%dd% 

Os resultados seriam semelhantes:

 IIS Date: 130904 AWS Date: 2013-09-04 

Script retirado de http://www.powercram.com/2010/07/get-yesterdays-date-in-ms-dos-batch.html

Existe uma maneira muito mais barata de fazer isso, exclusivamente em lote. Eu sei que é difícil, mas funcionou para mim.

Basicamente, escreva a data de ontem em um arquivo de texto como yesterday.txt . Em seguida, ligue para a próxima vez que o processo for executado. Funciona para um processo que tenho apenas uma vez por dia.

 ::pick up yesterdays date from file ::Needs to be done as the file generated today is *yesterdays* report. for /F "tokens=1" %%a IN (D:\BIN\Yesterday.txt) DO set yest=%%a ::Write todays date to file for use tomorrow echo %date% >D:\BIN\Yesterday.txt 

Então você pode chamar a data de ontem como variável com %yest% .

Eu realizei a data de ontem como segue.

 set m=%date:~-7,2% set /A m -= 1 set DATE_DIR=%date:~-10,2%-%m%-%date:~-4,4% 

o formato pode ser alterado na linha 3

saída de amostra: 13-03-2013

esta é a maneira mais simples que encontrei para fazer isso.

1) Aqui está um script chamado yesterday.bat :

  @if (@x)==(@y) @end /***** jscript comment ****** @echo off cscript //E:JScript //nologo "%~f0" exit /b 0 @if (@x)==(@y) @end ****** end comment *********/ var d = new Date(); d.setDate(d.getDate() - 1); var mm=(d.getMonth())+1 if (mm<10){ mm="0"+mm; } var dd=d.getDate(); if (dd<10) { dd="0"+dd; } WScript.Echo(d.getFullYear()+""+mm+""+dd); 

você pode usá-lo como

 for /f %%a in ('yesterday.bat') do set "ystd=%%a" 

2) Aqui está um one-liner com o powershell que você provavelmente instalou:

  powershell "[DateTime]::Today.AddDays(-1).ToString("""yyyyMMdd""")" 

e você pode atribuir isso à variável:

  for /f %%a in ('powershell "[DateTime]::Today.AddDays(-1).ToString("""yyyyMMdd""")"') do set ystd=%%a 

Simplesmente crie um arquivo de lote e adicione isto:

 @echo off set day=-1 echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s) echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2) for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a" del "%temp%\%~n0.vbs" set "YYYY=%result:~0,4%" set "MM=%result:~4,2%" set "DD=%result:~6,2%" set "result=%yyyy%-%mm%-%dd%" REM Below Will echo full date including year, month and yesterday's date. echo %result% REM Below line will echo yesterday's date (Day only). echo %DD% pause 

A maneira mais fácil de obter a data de ontem (AAAAMMDD) em lote é a seguinte:

 set D=%date:~-10,2% set /AD -= 1 echo %date:~-4,4%%date:~-7,2%%D%