date - print - Fecha de aritmética en scripts cmd
get date cmd script (5)
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
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.
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.
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 (sumar 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 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