Data aritmética em scripting cmd

votos
9

Eu preciso escrever um script para alterar um nome das aDate.txt para bDate.txt onde:

  • AData é a data atual do sistema em aaaammdd formato e
  • bDate é a data atual do sistema - 1 em aaaammdd formato.

Eu tenho atualmente:

set yy=%date:~6,2%
set mm=%date:~3,2%
set dd=%date:~0,2%
if %date:~6,1%==  set yy=0%yy:~1,1%
if %date:~3,1%==  set mm=0%mm:~1,1%
if %date:~0,1%==  set dd=0%dd:~1,1%
SET sys_date=20%yy%%mm%%dd%
ECHO %sys_date%
REM still have to do this bit properly
SET sys_date_yesterday=%sys_date%a
move %sys_date%.txt %sys_date_yesterday%.txt

mas não tenho idéia de como fazer a data -1 coisa (que não seja o prolixo) subtraia 1 do dia e se isso é = 0, em seguida, subtrair um do mês e definir o dia = ao último dia do novo mês e assim por anos.

Alguma ideia?

Publicado 10/12/2008 em 09:36
fonte usuário
Em outras línguas...                            


5 respostas

votos
9

Isso também funciona:

http://www.robvanderwoude.com/datetiment.php#Yesterday

Ele é muito completo em que ele verifica o registro para configurações de formato de data local e usa aqueles ao criar a data de ontem.

Respondeu 10/12/2008 em 11:24
fonte usuário

votos
4

Você tem que fazer isso da maneira difícil. Eu sugiro usar esta solução por SteveGTR. Eu copiar o texto abaixo, porque pelo menos pelo menos eu não possa sempre ver a solução no site.


Aqui está um arquivo de lote que eu desenvolvi para subtrair qualquer número de dias a partir da data atual. Ele aceita um parâmetro de linha de comando do número de dias. O padrão é de 1 dia (ontem):

@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%

echo Date %dayCnt% day(s) before %CurDate% is %mm%/%dd%/%yyyy%

Boa sorte, Steve

Respondeu 10/12/2008 em 10:59
fonte usuário

votos
2

Facilmente adicionar ou subtrair dias de uma data com um script em lotes do Windows

Aqui está uma solução que eu vim com a data (adicionar ou subtrair) com um script em lotes cálculo. Defina as variáveis ​​de acordo com as suas necessidades e, em seguida, ajustar a lógica como necessidade para as suas necessidades também. Isso funciona muito bem para as minhas necessidades e está tudo contido ao mesmo script um lote sem muita lógica.

Para adicionar: Você também pode usar esse script para adicionar um número de dias para a data atual, suprimindo a menos ( -) símbolo do script em lotes abaixo na :DynamicVBSScriptBuildrotina, então onde você vê este ,-%MinusDay%,você simples remover o sinal de subtração para obter ,%MinusDay%,em cada dessas linhas e agora o MinusDay=valor da variável será igual ao número de dias que você deseja adicionar.

Nota importante: Parece que cinco 9 de ( 99999) é o limite para o script em lotes quando subtraindo o MinusDays=valor. Parece também que seis 9 de ( 999999) é o limite para o script em lotes ao adicionar com o MinusDays=valor.

batch Script

@ECHO ON

::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run
SET MinusDay=2

:: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify
CALL :DynamicVBSScriptBuild

FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS%"') DO SET YYYY=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS%"') DO SET MM=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS%"') DO SET DD=%%A

::// Set your web server log file path in the below variable
SET WebServerLogPath=C:\WebServer\Logs

::// Set web server log file name where YYYY MM DD variables are set to the values after the day numbers setup above are subtracted
SET YYYY=%YYYY%
SET MM=%MM%
SET DD=%DD%

ECHO %YYYY%%MM%%DD%
PAUSE

GOTO EOF

:DynamicVBSScriptBuild
SET YYYYTmpVBS=%temp%\~tmp_yyyy.vbs
SET MMTmpVBS=%temp%\~tmp_mm.vbs
SET DDTmpVBS=%temp%\~tmp_dd.vbs
IF EXIST "%YYYYTmpVBS%" DEL /Q /F "%YYYYTmpVBS%"
IF EXIST "%MMTmpVBS%" DEL /Q /F "%MMTmpVBS%"
IF EXIST "%DDTmpVBS%" DEL /Q /F "%DDTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%YYYYTmpVBS%"
ECHO yyyy = Year(dt)                    >> "%YYYYTmpVBS%"
ECHO WScript.Echo yyyy                  >> "%YYYYTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%MMTmpVBS%"
ECHO mm = Right("0" ^& Month(dt),2)     >> "%MMTmpVBS%"
ECHO WScript.Echo mm                    >> "%MMTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%DDTmpVBS%"
ECHO dd = Right("0" ^& Day(dt),2)       >> "%DDTmpVBS%"
ECHO WScript.Echo dd                    >> "%DDTmpVBS%"
GOTO EOF

outros Recursos

Respondeu 22/07/2016 em 16:48
fonte usuário

votos
1

Experimente com este código em outras palavras. Você poderia usar como uma sub-rotina script ou usar isso com as funções de chamada e parâmetros para passar de volta para o arquivo de lote original:

:: Pass 1st parameter as number of days (whole numbers) to subtract from current day in   date
:: This script is able to subtract days to any date of the current date
:: This script will check for leap years, etc. as well
@echo on
::for /f "tokens=2-4 delims=/ " %%A in ("%date%") do set "mm=%%A" do & set "dd=%%B" do & set "yyyy=%%C"
set "mm=%date:~4,2%" & set "dd=%date:~7,2%" & set "yyyy=%date:~10,4%"
set CurDate=%mm%/%dd%/%yyyy%
set dayCnt=%1
if "%dayCnt%"=="" set dayCnt=1
:: 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
:: ** 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%
echo Date %dayCnt% day(s) before %CurDate% is %mm%/%dd%/%yyyy%
SET DirDate=%mm%/%dd%/%yyyy%
:: The %2 parameter is passed from the calling script as the full path and name of the          file to call back
:: %2 equals %~fnx0
:: The dirdate variable is passed as parameter %1 back to the calling script
Call %2 %dirdate%
GOTO EOF

Vou procurar um vb ou algo mais eficiente que ainda pode incorporar ou ligar a partir de um lote para calcular dinamicamente datas.

Respondeu 11/06/2012 em 05:06
fonte usuário

votos
1

Eu precisava de algo que iria subtrair dias a partir da data atual ao verificar os anos bissextos, etc. e isso funcionou muito bem.

Eu só chamá-lo a partir desses scripts com o parâmetro necessário (número de dias para subtrair), e depois tê-lo chamar de volta o script chamado com substituições e passar um parâmetro de volta para o roteiro original a data de modificação (subtraído) para.

Aqui estão alguns exemplos:

Script variável precisando cálculo data marcada:

IF "%1"=="" goto modifydate

:modifydate
SET subtractdays=5
SET ModDateScript=\\servershare\path\Called_Scripts\ModDate.cmd
CALL "%ModDateScript%" %subtractdays% "%~fnx0"

Script que irá calcular e passar de volta um parâmetro% moddate% para o script chamado original a ser definido como uma variável para que possa processar em conformidade. Você vai simplesmente colocar isso no final do script que você chamar para modificar / subtrair dias a partir da data atual (ModDate.cmd).

SET moddate=%mm%/%dd%/%yyyy%
Call %2 %moddate%
GOTO EOF

Eu era capaz de testar e determinar que essas linhas a partir do roteiro original postada:

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

Pode ser substituído com apenas esta única linha e ele funciona muito bem:

FOR /F "tokens=2-4 delims=/ " %%A IN ("%date%") DO SET "mm=%%A" DO (& SET "dd=%%B") DO (& SET "yyyy=%%C")

Por favor, explique o que essas linhas (os que eu alterado para apenas uma linha com e declarações) fazer de qualquer maneira porque eu não posso dizer a diferença rapidamente testar. I subtraído de volta ao século 19 e parecia precisas para mim. Pensei que talvez ele ajudou a lidar com os cálculos, onde o ano modificado seria inferior a 2000 - mas eu não ver que a menos que eu estou faltando alguma coisa.

Caso contrário, este script pode ser facilmente chamado e passar de volta o% mm% /% dd% /% aaaa% como parâmetro para vários scripts que precisam de seus próprios cálculos. solução lote grande e muito eficiente. I pode passar o argumento como% 1,% 2,% 3, etc. e ainda usar o setlocal nesse roteiro para a data atual - apenas fazer uma coisa variável como moddate =% 1, etc.

Por último, eu desafio a qualquer especialista script em lotes para otimizar este script ainda mais longe e enviar de volta os resultados de lotes de pessoas para testar.

Graças, P

Respondeu 07/05/2012 em 02:48
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more