中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]取前一天的日期的bat脚本
作者:
标题: [原创]取前一天的日期的bat脚本 上一主题 | 下一主题
mayining
新手上路




积分 6
发帖 2
注册 2008-1-17
状态 离线
『楼 主』:  [原创]取前一天的日期的bat脚本

这个是我前些日子刚写的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!


2008-1-17 10:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
daker
初级用户





积分 34
发帖 17
注册 2007-5-23
状态 离线
『第 2 楼』:  

为什么不用for /l ???

2008-1-17 12:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
honghunter
中级用户





积分 321
发帖 135
注册 2007-2-4
状态 离线
『第 3 楼』:  

支持一下,谢谢分享。



探讨批量下载与智能化的下载
2008-1-17 13:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
daker
初级用户





积分 34
发帖 17
注册 2007-5-23
状态 离线
『第 4 楼』:  

俺用FOR /L给你改了下 权当自己练习~~~~应该简练一些~~

  Quote:
::--------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!



2008-1-17 14:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  

求N天前的日期
http://www.cn-dos.net/forum/viewthread.php?tid=31296

2008-1-17 15:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
mayining
新手上路




积分 6
发帖 2
注册 2008-1-17
状态 离线
『第 6 楼』:  回复

恩, daker兄弟你的代码我认真阅读了, 确实比我的要简练多了, 当时没有考虑到用for /l 就能解决已知定长字符串的问题, 很感谢!
HAT兄弟的代码我也看了, 比我的功能要强大, 而且解法2,3以日期的数学本质去处理, 感觉专业多了, 我想当我有可的时候, 写一个脚本日历程序, 这样就可以根本解决bat中date函数的缺陷了, 不知道是不是已经有人做了呢? 好啦, 结贴, 再次感谢大家

2008-1-17 16:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fzp1978321
初级用户





积分 110
发帖 50
注册 2008-1-18
状态 离线
『第 7 楼』:  

那如何在WIN2000下获取前一天的日期呢?
这些都是XP环境下的.

2008-3-6 12:03
查看资料  发送邮件  发短消息 网志  OICQ (195690504)  编辑帖子  回复  引用回复
xaleibin
新手上路





积分 4
发帖 2
注册 2008-10-1
状态 离线
『第 8 楼』:  少一行代码

应该在批处理文件的前面加入一行
setlocal enabledelayedexpansion
表示启用变量延迟,否则这个程序不行正常执行,我已试过。
最后感谢你的分亨,帮我解决了问题。

2008-10-1 04:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xaleibin
新手上路





积分 4
发帖 2
注册 2008-10-1
状态 离线
『第 9 楼』:  补充

只有启用了变量延迟,才能用!!将变量名扩起来表示对变量值的引用。

2008-10-1 04:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yanglei
新手上路





积分 7
发帖 4
注册 2009-10-19
状态 离线
『第 10 楼』:  

如果有数据库连接的话,可以从数据库里取sysdate-1,然后写到一个文件中,再从文件中将前一天的日期取出即可,,,前提 要能连数据库 嘎嘎

2009-11-5 22:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hbby
中级用户





积分 220
发帖 99
注册 2005-8-16
状态 离线
『第 11 楼』:  

@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
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: