|
mayining
新手上路

积分 6
发帖 2
注册 2008-1-17
状态 离线
|
『楼 主』:
[原创]取前一天的日期的bat脚本
使用 LLM 解释/回答一下
这个是我前些日子刚写的bat中的一部分, 这是我第一次写bat脚本, 那段日子成天泡在联盟中学习bat的知识, 非常感谢联盟的兄弟们!
由于批处理脚本在自动上传文件中使用的非常广泛, 取前一天的日期是完成该任务大多会碰到的问题, 所以把代码贴在这里供像我一样的新手参考.
我的方法有一点取巧之嫌: 如果当天是1号, 那么需要处理月(也许有年), 然后列举前一月最后一天的日, 比如10月就一定是31天, 但是2月就要特殊处理, 需要计算是否为闰年, 具体的计算方法可以在我的代码中看到, 这个想必难不倒大家, 最后将日期一拼就是前一天的日期啦.
希望大家有更好的方法把代码贴出来分享一下:)
::--------Generate Last Date----------
echo Generate last datetime...
set TodayYear=%date:~0,4%
set TodayMon=%date:~5,2%
set TodayDay=%date:~8,2%
set LastdayYear=
set LastdayMon=
set LastdayDay=
set LastdayYear=%TodayYear%
set LastdayMon=%TodayMon%
set /A LastdayDay=TodayDay-1
if "%LastdayDay%" == "0" (
if "!LastdayMon!" == "01" (
set LastdayMon=12
set /A LastdayYear-=1
) else (
set /A LastdayMon-=1
if "!LastdayMon!" == "1" set LastdayMon=01
if "!LastdayMon!" == "2" set LastdayMon=02
if "!LastdayMon!" == "3" set LastdayMon=03
if "!LastdayMon!" == "4" set LastdayMon=04
if "!LastdayMon!" == "5" set LastdayMon=05
if "!LastdayMon!" == "6" set LastdayMon=06
if "!LastdayMon!" == "7" set LastdayMon=07
if "!LastdayMon!" == "8" set LastdayMon=08
if "!LastdayMon!" == "9" set LastdayMon=09
)
if "!LastdayMon!" == "01" set LastdayDay=31
if "!LastdayMon!" == "03" set LastdayDay=31
if "!LastdayMon!" == "04" set LastdayDay=30
if "!LastdayMon!" == "05" set LastdayDay=31
if "!LastdayMon!" == "06" set LastdayDay=30
if "!LastdayMon!" == "07" set LastdayDay=31
if "!LastdayMon!" == "08" set LastdayDay=31
if "!LastdayMon!" == "09" set LastdayDay=30
if "!LastdayMon!" == "10" set LastdayDay=31
if "!LastdayMon!" == "11" set LastdayDay=30
if "!LastdayMon!" == "12" set LastdayDay=31
if "!LastdayMon!" == "02" (
set IsLeapYear=
set /A IsLeapYear=!LastdayYear!%%400
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear!%%100
if "!IsLeapYear!" == "0" (
set LastdayDay=28
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear%%4
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
) else (
set LastdayDay=28
goto MAKELASTDATE
)
)
)
:MAKELASTDATE
if "%LastdayDay%" == "1" set LastdayDay=01
if "%LastdayDay%" == "2" set LastdayDay=02
if "%LastdayDay%" == "3" set LastdayDay=03
if "%LastdayDay%" == "4" set LastdayDay=04
if "%LastdayDay%" == "5" set LastdayDay=05
if "%LastdayDay%" == "6" set LastdayDay=06
if "%LastdayDay%" == "7" set LastdayDay=07
if "%LastdayDay%" == "8" set LastdayDay=08
if "%LastdayDay%" == "9" set LastdayDay=09
set LastDate=%LastdayYear%.%LastdayMon%.%LastdayDay%
echo Generate last datetime OK!
This is part of a bat I just wrote a few days ago. This is my first time writing a bat script. Those days I was often soaking in the union to learn bat knowledge, and I'm very grateful to the brothers in the union!
Since batch scripts are very widely used in automatic file uploading, getting the date of the previous day is a problem that is mostly encountered when completing this task, so I post the code here for newbies like me to refer to.
My method is a bit of a trick: if today is the 1st, then I need to handle the month (maybe the year), and then list the last day of the previous month. For example, October must definitely have 31 days, but February needs special handling. I need to calculate whether it's a leap year. The specific calculation method can be seen in my code. I'm sure this won't stump everyone. Finally, I just put the date together to get the date of the previous day.
I hope everyone has a better method and post the code to share it :)
::--------Generate Last Date----------
echo Generate last datetime...
set TodayYear=%date:~0,4%
set TodayMon=%date:~5,2%
set TodayDay=%date:~8,2%
set LastdayYear=
set LastdayMon=
set LastdayDay=
set LastdayYear=%TodayYear%
set LastdayMon=%TodayMon%
set /A LastdayDay=TodayDay-1
if "%LastdayDay%" == "0" (
if "!LastdayMon!" == "01" (
set LastdayMon=12
set /A LastdayYear-=1
) else (
set /A LastdayMon-=1
if "!LastdayMon!" == "1" set LastdayMon=01
if "!LastdayMon!" == "2" set LastdayMon=02
if "!LastdayMon!" == "3" set LastdayMon=03
if "!LastdayMon!" == "4" set LastdayMon=04
if "!LastdayMon!" == "5" set LastdayMon=05
if "!LastdayMon!" == "6" set LastdayMon=06
if "!LastdayMon!" == "7" set LastdayMon=07
if "!LastdayMon!" == "8" set LastdayMon=08
if "!LastdayMon!" == "9" set LastdayMon=09
)
if "!LastdayMon!" == "01" set LastdayDay=31
if "!LastdayMon!" == "03" set LastdayDay=31
if "!LastdayMon!" == "04" set LastdayDay=30
if "!LastdayMon!" == "05" set LastdayDay=31
if "!LastdayMon!" == "06" set LastdayDay=30
if "!LastdayMon!" == "07" set LastdayDay=31
if "!LastdayMon!" == "08" set LastdayDay=31
if "!LastdayMon!" == "09" set LastdayDay=30
if "!LastdayMon!" == "10" set LastdayDay=31
if "!LastdayMon!" == "11" set LastdayDay=30
if "!LastdayMon!" == "12" set LastdayDay=31
if "!LastdayMon!" == "02" (
set IsLeapYear=
set /A IsLeapYear=!LastdayYear!%%400
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear!%%100
if "!IsLeapYear!" == "0" (
set LastdayDay=28
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear%%4
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
) else (
set LastdayDay=28
goto MAKELASTDATE
)
)
)
:MAKELASTDATE
if "%LastdayDay%" == "1" set LastdayDay=01
if "%LastdayDay%" == "2" set LastdayDay=02
if "%LastdayDay%" == "3" set LastdayDay=03
if "%LastdayDay%" == "4" set LastdayDay=04
if "%LastdayDay%" == "5" set LastdayDay=05
if "%LastdayDay%" == "6" set LastdayDay=06
if "%LastdayDay%" == "7" set LastdayDay=07
if "%LastdayDay%" == "8" set LastdayDay=08
if "%LastdayDay%" == "9" set LastdayDay=09
set LastDate=%LastdayYear%.%LastdayMon%.%LastdayDay%
echo Generate last datetime OK!
|
|
2008-1-17 10:57 |
|
|
daker
初级用户
 
积分 34
发帖 17
注册 2007-5-23
状态 离线
|
|
2008-1-17 12:27 |
|
|
honghunter
中级用户
  
积分 321
发帖 135
注册 2007-2-4
状态 离线
|
|
2008-1-17 13:06 |
|
|
daker
初级用户
 
积分 34
发帖 17
注册 2007-5-23
状态 离线
|
『第 4 楼』:
使用 LLM 解释/回答一下
俺用FOR /L给你改了下 权当自己练习~~~~应该简练一些~~
::--------Generate Last Date----------
echo Generate last datetime...
set TodayYear=%date:~0,4%
set TodayMon=%date:~5,2%
set TodayDay=%date:~8,2%
set LastdayYear=
set LastdayMon=
set LastdayDay=
set LastdayYear=%TodayYear%
set LastdayMon=%TodayMon%
set /A LastdayDay=TodayDay-1
if "%LastdayDay%" == "0" (
if "!LastdayMon!" == "01" (
set LastdayMon=12
set /A LastdayYear-=1
) else (
set /A LastdayMon-=1
for /l %%a in (1,1,9) do if !LastdayMon! == %%a (set LastdayMon=0%%a)
)
for /l %%a in (1,2,7) do (
if !LastdayMon! equ %%a (set set LastdayDay=31)
else
for /l %%a in (8,2,12) do if !LastdayMon! equ %%a (set set LastdayDay=31)
else
if "!LastdayMon!" == "02" (
set IsLeapYear=
set /A IsLeapYear=!LastdayYear!%%400
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear!%%100
if "!IsLeapYear!" == "0" (
set LastdayDay=28
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear%%4
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
else (
set LastdayDay=28
goto MAKELASTDATE
)
)
else set LastdayDay=30
)
)
:MAKELASTDATE
for /l %%a in (1,1,9) do if %LastdayDay% == 1 (set LastdayDay=0%%a)
set LastDate=%LastdayYear%.%LastdayMon%.%LastdayDay%
echo Generate last datetime OK!
I used FOR /L to modify it, just for my own practice~~~~ It should be more concise~~
::--------生成最后日期----------
echo 生成最后日期时间...
set TodayYear=%date:~0,4%
set TodayMon=%date:~5,2%
set TodayDay=%date:~8,2%
set LastdayYear=
set LastdayMon=
set LastdayDay=
set LastdayYear=%TodayYear%
set LastdayMon=%TodayMon%
set /A LastdayDay=TodayDay-1
if "%LastdayDay%" == "0" (
if "!LastdayMon!" == "01" (
set LastdayMon=12
set /A LastdayYear-=1
) else (
set /A LastdayMon-=1
for /l %%a in (1,1,9) do if !LastdayMon! == %%a (set LastdayMon=0%%a)
)
for /l %%a in (1,2,7) do (
if !LastdayMon! equ %%a (set set LastdayDay=31)
else
for /l %%a in (8,2,12) do if !LastdayMon! equ %%a (set set LastdayDay=31)
else
if "!LastdayMon!" == "02" (
set IsLeapYear=
set /A IsLeapYear=!LastdayYear!%%400
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear!%%100
if "!IsLeapYear!" == "0" (
set LastdayDay=28
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear%%4
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
else (
set LastdayDay=28
goto MAKELASTDATE
)
)
else set LastdayDay=30
)
)
:MAKELASTDATE
for /l %%a in (1,1,9) do if %LastdayDay% == 1 (set LastdayDay=0%%a)
set LastDate=%LastdayYear%.%LastdayMon%.%LastdayDay%
echo 生成最后日期时间成功!
|
|
2008-1-17 14:39 |
|
|
HAT
版主
       
积分 9023
发帖 5017
注册 2007-5-31
状态 离线
|
|
2008-1-17 15:14 |
|
|
mayining
新手上路

积分 6
发帖 2
注册 2008-1-17
状态 离线
|
『第 6 楼』:
回复
使用 LLM 解释/回答一下
恩, daker兄弟你的代码我认真阅读了, 确实比我的要简练多了, 当时没有考虑到用for /l 就能解决已知定长字符串的问题, 很感谢!
HAT兄弟的代码我也看了, 比我的功能要强大, 而且解法2,3以日期的数学本质去处理, 感觉专业多了, 我想当我有可的时候, 写一个脚本日历程序, 这样就可以根本解决bat中date函数的缺陷了, 不知道是不是已经有人做了呢? 好啦, 结贴, 再次感谢大家
Well, Brother daker, I have carefully read your code. It's indeed much more concise than mine. I didn't consider that using for /l could solve the problem of known - length strings at that time. Thanks a lot! I've also looked at Brother HAT's code. His code is more powerful in functionality, and the solutions 2 and 3 deal with it from the mathematical essence of dates, which feels much more professional. I think when I have time, I'll write a script calendar program, so that I can fundamentally solve the defects of the date function in bat. I wonder if someone has already done it? Well, closing the thread. Thanks to everyone again.
|
|
2008-1-17 16:30 |
|
|
fzp1978321
初级用户
 
积分 110
发帖 50
注册 2008-1-18
状态 离线
|
『第 7 楼』:
使用 LLM 解释/回答一下
那如何在WIN2000下获取前一天的日期呢?
这些都是XP环境下的.
Then how to get the date of the previous day under WIN2000? These are all under XP environment.
|
|
2008-3-6 12:03 |
|
|
xaleibin
新手上路

积分 4
发帖 2
注册 2008-10-1
状态 离线
|
『第 8 楼』:
少一行代码
使用 LLM 解释/回答一下
应该在批处理文件的前面加入一行
setlocal enabledelayedexpansion
表示启用变量延迟,否则这个程序不行正常执行,我已试过。
最后感谢你的分亨,帮我解决了问题。
You should add a line "setlocal enabledelayedexpansion" at the front of the batch file, which means enabling variable delay; otherwise, this program will not execute normally. I have tried it. Finally, thank you for sharing, which helped me solve the problem.
|
|
2008-10-1 04:52 |
|
|
xaleibin
新手上路

积分 4
发帖 2
注册 2008-10-1
状态 离线
|
『第 9 楼』:
补充
使用 LLM 解释/回答一下
只有启用了变量延迟,才能用!!将变量名扩起来表示对变量值的引用。
Only when variable delay is enabled can you use !! to enclose the variable name to represent the reference to the variable value.
|
|
2008-10-1 04:54 |
|
|
yanglei
新手上路

积分 7
发帖 4
注册 2009-10-19
状态 离线
|
『第 10 楼』:
使用 LLM 解释/回答一下
如果有数据库连接的话,可以从数据库里取sysdate-1,然后写到一个文件中,再从文件中将前一天的日期取出即可,,,前提 要能连数据库 嘎嘎
If there is a database connection, you can take sysdate - 1 from the database, write it to a file, and then take out the date of the previous day from the file... The premise is that you can connect to the database, heh heh
|
|
2009-11-5 22:26 |
|
|
hbby
中级用户
  
积分 220
发帖 99
注册 2005-8-16
状态 离线
|
『第 11 楼』:
使用 LLM 解释/回答一下
@echo off
echo Wscript.echo dateadd("d",-1,date)>vbs.vbs
for /f %%a in ('cscript //nologo vbs.vbs') do del vbs.vbs&&echo %%a
@echo off
echo Wscript.echo dateadd("d",-1,date)>vbs.vbs
for /f %%a in ('cscript //nologo vbs.vbs') do del vbs.vbs&&echo %%a
|
|
2009-12-16 15:51 |
|