我需要编写一个脚本,将文件名从aDate.txt更改为bDate.txt,其中:
我目前有:
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
但是我不知道如何做日期-1的事情(除了长篇大论),从日期减去1,如果是=0,那么从月份减去1,并将日期设置为新月份的最后一天,依此类推。
有什么想法吗?
发布于 2008-12-10 09:59:26
你必须用困难的方式去做。我建议使用SteveGTR的this解决方案。我复制下面的文本,因为至少我不能总是在该网站上看到解决方案。
这是我开发的一个批处理文件,用于从当前日期减去任意天数。它接受天数的命令行参数。默认值为1天(昨天):
@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%
祝你好运,史蒂夫
发布于 2016-07-23 00:48:56
使用Windows批处理脚本轻松添加或减去日期中的天数
这是我提出的一个使用批处理脚本计算日期(加或减)的解决方案。根据您的需要设置相应的变量,然后根据您的需要调整逻辑。这很好地满足了我的需求,并且都包含在同一个批处理脚本中,没有太多的逻辑。
要添加的:您还可以使用此脚本,通过在:DynamicVBSScriptBuild
例程中删除以下批处理脚本中的减号(**-
**)符号,将天数添加到当前日期,因此,在您看到此,-%MinusDay%,
的位置,只需删除减号,即可在每一行上获得,%MinusDay%,
,现在MinusDay=
变量值将等于您要添加的天数。
重要说明:当用MinusDays=
值减去时,5个9 (99999
)似乎是批处理脚本的限制。在使用MinusDays=
值添加时,批处理脚本的限制似乎也是6个9 (999999
)。
批处理脚本
@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
更多资源
发布于 2012-05-07 09:48:06
我需要一些东西,可以在检查闰年时从当前日期中减去天数,等等,这很有效。
我只是使用所需的参数(要减去的天数)从这些脚本中调用它,然后让它通过替换回调调用脚本,并将一个参数传递回修改(减去)日期的原始脚本。
下面是一些示例:
需要设置日期计算变量的脚本:
IF "%1"=="" goto modifydate
:modifydate
SET subtractdays=5
SET ModDateScript=\\servershare\path\Called_Scripts\ModDate.cmd
CALL "%ModDateScript%" %subtractdays% "%~fnx0"
该脚本将计算%moddata%参数并将其传递回原始调用脚本,以设置为变量,以便进行相应的处理。您只需将其放在您调用的脚本的末尾,以修改当前日期/从当前日期中减去日期(ModDate.cmd)。
SET moddate=%mm%/%dd%/%yyyy%
Call %2 %moddate%
GOTO EOF
我能够测试并确定原始脚本中的这些代码行是否发布:
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
可以仅用这一行来替换,并且它也同样有效:
FOR /F "tokens=2-4 delims=/ " %%A IN ("%date%") DO SET "mm=%%A" DO (& SET "dd=%%B") DO (& SET "yyyy=%%C")
请解释一下这些行(我用and语句改成只有一行)是做什么的,因为我不能很快地测试出区别。我退回到19世纪,它对我来说似乎是准确的。我认为它可能有助于处理修改后的年份将小于2000的计算--但我没有看到这一点,除非我遗漏了什么。
否则,可以很容易地调用这个脚本,并将%mm%/%dd%/%yyyy%作为参数传回给几个需要自己计算的脚本。非常好且非常高效的批处理解决方案。我可以将参数作为%1、%2、%3等进行传递,并且仍然在该脚本中使用当前日期的setlocal --只需创建一个类似moddate=%1等的变量即可。
最后,我向任何批处理脚本专家发起挑战,让他们进一步优化这个脚本,并将结果发布给批处理人员进行测试。
谢谢,P
https://stackoverflow.com/questions/355425
复制相似问题