Fecha de aritmética en scripts cmd

Necesito escribir un script para cambiar un nombre de archivo de aDate.txt a bDate.txt donde:

  • aDate es la fecha actual del sistema en formato aaaammdd y
  • bDate es la fecha actual del sistema: 1 en el formato aaaammdd .

Actualmente tengo:

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 

pero no tengo idea de cómo hacer la fecha -1 cosa (que no sea la larga) restar 1 del día y si eso es = 0, restar uno del mes y establecer el día = hasta el último día del nuevo mes y así sucesivamente durante años.

¿Algunas ideas?

Esto también funciona:

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

Es muy completo, ya que comprueba el registro para la configuración de formato de fecha local y los utiliza al crear la fecha de ayer.

Tienes que hacerlo de la manera difícil. Sugiero usar esta solución de SteveGTR. Copio el texto a continuación, porque al menos al menos no siempre puedo ver la solución en ese sitio.


Aquí hay un archivo por lotes que desarrollé para restar cualquier número de días de la fecha actual. Acepta un parámetro de línea de comando del número de días. El valor predeterminado es 1 día (ayer):

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

Buena suerte, Steve

Agregue o reste fácilmente días de una fecha con un script por lotes de Windows

Aquí hay una solución que se me ocurrió para calcular la fecha (sumr o restar) con un script por lotes. Establezca las variables de acuerdo a sus necesidades y luego ajuste la lógica según sea necesario para sus necesidades. Esto funciona muy bien para mis necesidades y todo está contenido en el mismo script por lotes sin demasiada lógica.

Para agregar: también puede usar esta secuencia de comandos para agregar un número de días a la fecha actual eliminando el símbolo menos ( - ) del siguiente script por lotes en la rutina :DynamicVBSScriptBuild , de modo que donde vea esto ,-%MinusDay%, usted simplemente elimine el símbolo menos para obtener ,%MinusDay%, en cada una de esas líneas y ahora el valor de la variable MinusDay= igualará el número de días que desea agregar.

Nota importante: parece que cinco 9 ( 99999 ) es el límite en el script por lotes al restar con el valor MinusDays= . También parece que seis 9 ( 999999 ) es el límite en el script por lotes cuando se agrega con el valor MinusDays= .

Batch Script

 @ECHO ON ::// Minus days is the number of days to subtract from the CURRENT DAY ie 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 

Recursos adicionales

  • FOR / F
  • CSCRIPT
  • WSCRIPT
  • FechaAdd
  • Derecha

Necesitaba algo que restara días de la fecha actual mientras revisaba años bisiestos, etc. y funcionó de maravilla.

Simplemente lo llamo desde esos scripts con el parámetro necesario (número de días para restar), y luego hago que devuelva la llamada al script de llamada con sustituciones y devuelva un parámetro al script original para la fecha modificada (substraída).

Aquí hay ejemplos:

Script que necesita el conjunto de variables de cálculo de fecha:

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

Secuencia de comandos que calculará y devolverá un parámetro% moddate% al script de llamada original para establecerse como una variable para que procese en consecuencia. Simplemente colocará esto al final del script que llama para modificar / restar días de la fecha actual (ModDate.cmd).

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

Pude probar y determinar que estas líneas del guión original publicado:

 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 

Se puede reemplazar con solo una línea y funciona igual de bien:

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

Por favor, explique de qué manera esas líneas (las que cambié a solo la línea con y las declaraciones) lo hacen de todos modos porque no puedo distinguir las pruebas rápidamente. Lo resté al siglo XIX y me pareció correcto. Pensé que tal vez ayudó a manejar los cálculos donde el año modificado sería menos de 2000, pero no lo vi a menos que me falta algo.

De lo contrario, este único script se puede llamar fácilmente y devolver el% mm% /% dd% /% yyyy% como parámetro para varios scripts que necesitan sus propios cálculos. Solución de lote genial y muy eficiente. Puedo pasar el argumento como% 1,% 2,% 3, etc. y aún usar el setlocal en ese script para la fecha actual – simplemente haga una variable algo como moddate =% 1, etc.

Por último, desafío a cualquier experto en secuencias de comandos por lotes para optimizar aún más este script y publicar los resultados de las pruebas por lotes.

Gracias p

Pruebe con este código en otras palabras. Puede utilizarlo como una subrutina de script o usarlo con las funciones CALL y parámetros para volver al archivo por lotes 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 

Voy a buscar un vb o algo más eficiente que pueda incorporar o llamar de un lote para calcular dinámicamente las fechas.