精品技术论坛

精品技术论坛 (https://bbs.et8.net/bbs/index.php)
-   『软件使用』 (https://bbs.et8.net/bbs/forumdisplay.php?f=17)
-   -   【求助】批处理命令能否每7天自动更新调用当天日期 (https://bbs.et8.net/bbs/showthread.php?t=1391673)

C# 2021-02-22 15:02:16

echo %date% 里有 weekday呀

然后
代码:

set weekday=%date:~11,2%
set "ymd=%date:~,4%%date:~5,2%%date:~8,2%"

IF "%weekday%" =="周五" (
  ECHO %weekday%
    WINRAR...%ymd%
)

如果有ELSE 就用
代码:

IF "%weekday%" =="周五" (
  ECHO %weekday%
    WINRAR...%ymd%
) ELSE (
  echo %weekday%
  .....
)


就行了
就OK了。

lucida 2021-02-22 15:24:18

数据库备份的时候,自动按周五日期命名备份文件
批处理需要匹配这个文件名,是这个意思吗?

如果这样,可以列所有符合格式的文件,找到最新的那个
从文件名里面截取日期

xclimbing 2021-02-22 16:05:03

引用:

作者: lminz (文章 17732729)
再次谢谢老大,给我写了这么多
只要是118老大没给个发红包的功能,,,4
例如我改日期到4月,运行结果是这个

当前基础日期:2021-02-19
当前日期:2021-04-09
下一个基础日期:2021-02-26
当前基础日期:2021-02-26
请按任意键继续. .


我批处理就是这样的
主要是老大你的代码我...

要不说没有搞过程序设计的人,最好还是先把问题交待清楚,你纠结于生成这个日期,其实完全没有必要,楼上这个从现有文件名中提取日期的思路就很正确。

例如,下面的代码是不是根本不需要计算日期,就自动解决了所有问题:
代码:

for /f "tokens=*"  %%i in ('dir /b/od \\IP地址\dbbackup\*log.bak') do set lastfile=%%i
set thedate=%lastfile:~0,8%
echo 获取的最新备份文件日期前缀为:%thedate%
set "ymd=%date:~,4%%date:~5,2%%date:~8,2%"
"G:\Job\FastCopy.exe" /cmd=Sync  /auto_close /no_ui  /balloon=FALSE  /error_stop=FALSE /log /logfile=G:\Job\Log\%ymd%dailylog.log /utf8  /Include="%thedate%*log.bak "  "\\IP地址\DBbackup"  /to="H:\dbbackup"
C:\WinRAR\WinRAR.exe a -m4 密码 H:\bin\DailyLog\%thedate%systemdb_log.rar H:\dbbackup\%thedate%systemdb_log.bak


lminz 2021-02-22 16:30:52

已取用18楼的方案。
18楼第二行要加个 set ""
已测试OK
非常感谢楼上各位的耐心指导。

xclimbing 2021-02-22 16:47:55

谢谢采纳。第二行确实丢了一个set命令,没有测试环境,所以没有实际运行测试。

lminz 2021-02-27 10:33:44

引用:

作者: xclimbing (文章 17732795)
谢谢采纳。第二行确实丢了一个set命令,没有测试环境,所以没有实际运行测试。

你好,能否再请教一下
列所有符合格式的文件,找到最新的那个
从文件名里面截取日期

这个已经可以,如果我想从指定第几个文件截取日期,请问应该怎么写?
不介意我@你一下吧,谢谢!
@xclimbing

xclimbing 2021-02-27 10:48:29

引用:

作者: lminz (文章 17734477)
你好,能否再请教一下
列所有符合格式的文件,找到最新的那个
从文件名里面截取日期

这个已经可以,如果我想从指定第几个文件截取日期,请问应该怎么写?
不介意我@你一下吧,谢谢!
@xclimbing

批处理的程序设计能力其实很差的,没有传统的编程语言那么随心所欲,比如你这个指定第几个文件的功能,几乎就没有简便的方法,至少暂时我没有什么好的解决方案,批处理的for命令只适合取最后一个(把顺序颠倒一遍也可以说是第一个)。而且,按你的程序运行环境,本来就应该取最后一个。其他特殊情况,那就要用更多代码来解决了。

你最好把详细的应用环境和设计目标交待一下,也就是把问题明确化(前面已经暴露了这个问题,你不懂编程,就明确说需求),否则你这甲方不断变换需求,乙方是会无所适从的。

lminz 2021-02-27 11:50:47

如果获取不到第几个文件名,那换个方法
就是取上一周的日期。
因为要做一次完全备份
这个是固定每周五运行,所以只需要取上周五的日期

xclimbing 2021-02-27 12:20:56

那就取得这个周五(当天)的日期,然后用我前面的批处理做一个减7天的操作不就完成任务了。

lucida 2021-02-27 14:18:39

forfiles

lminz 2021-02-27 16:40:31

引用:

作者: xclimbing (文章 17734503)
那就取得这个周五(当天)的日期,然后用我前面的批处理做一个减7天的操作不就完成任务了。

你看看是否有要改善的
红色日期我是手动改了测试的,正常换回%date%,每周五运行
暂时测试可以


代码:

@Echo Off
Echo NewDate = DateAdd^("d", Wscript.arguments^(1^), Wscript.arguments^(0^)^)>Day.vbs
Echo Wscript.Echo NewDate>>Day.vbs
echo set basedate=2021-02-26>basedate.bat

call basedate.bat
if not defined basedate set basedate=%date%
echo Current date:%basedate%
set dayadd=-7

for /f "tokens=*" %%i in ('cscript /nologo Day.vbs %basedate% %dayadd%') do (set nextdate=%%i)
::if %date% GEQ %nextdate% set basedate=%nextdate%
::echo set basedate=%basedate%>basedate.bat

set fullbakday=%basedate:~,4%%basedate:~5,2%%basedate:~8,2%
set today=%date:~,4%%date:~5,2%%date:~8,2%
set lastday=%nextdate:~,4%%nextdate:~5,2%%nextdate:~8,2%
echo Last full backup date:%basedate%

echo today:%today%
echo fullbakday:%fullbakday%
echo lastday:%lastday%
Del /q Day.vbs
Del /q basedate.bat

C:\WinRAR\WinRAR.exe a -m4 密码 H:\路径\%lastday%systemdb_log.rar \\IP地址\DBbackup\%lastday%systemdb_log.bak
C:\WinRAR\WinRAR.exe a -m4 密码 H:\路径\%fullbakday%systemdb.rar \\IP地址\DBbackup\%fullbakday%systemdb.bak


xclimbing 2021-02-27 17:54:18

引用:

作者: lminz (文章 17734569)
你看看是否有要改善的
红色日期我是手动改了测试的,正常换回%date%,每周五运行
暂时测试可以


[CODE]@Echo Off
Echo NewDate = DateAdd^("d", Wscript.arguments^(1^), Wscript.arguments^(0^)^)>Day.vbs
Echo Ws...

你这个逻辑还是很混乱的,按你这个程序,那个basedate不还是每次运行都需要手工设置吗?你理解我的批处理中为什么有这么两行代码吗?
echo set basedate=2021-02-26>basedate.bat
call basedate.bat

这两行,完全可以用:set basedate=2021-02-26这一条命令来代替,为什么我要这么设计?

另外,你这个批处理在计划任务中是什么时间执行的?

我主要搞不清楚,你批处理中的basedate跟today的关系,按道理说,这两个应该是同一天才对。你的批处理就应该是每周五执行,把上周的数据库完整备份本地压缩备份,然后是本周的日志文件本地压缩备份,对吧?

如果是这样的话,这个basedate变量就没有存在的必要了。

xclimbing 2021-02-27 18:01:23

上面没仔细看你的说明,确实就如同我所推测的,如果照你这么说,批处理完全可以改成这样:

代码:

@Echo Off
Echo NewDate = DateAdd^("d", Wscript.arguments^(1^), Wscript.arguments^(0^)^)>Day.vbs
Echo Wscript.Echo NewDate>>Day.vbs

echo Current date:%date%
set dayadd=-7

for /f "tokens=*" %%i in ('cscript /nologo Day.vbs %date% %dayadd%') do (set nextdate=%%i)

set fullbakday=%date:~,4%%date:~5,2%%date:~8,2%
::set today=fullbakday
set lastday=%nextdate:~,4%%nextdate:~5,2%%nextdate:~8,2%
echo Last full backup date:%date%

::echo today:%fullbakday%
echo Today is fullbakday:%fullbakday%
echo Last Friday:%lastday%

C:\WinRAR\WinRAR.exe a -m4 密码 H:\路径\%lastday%systemdb_log.rar \\IP地址\DBbackup\%lastday%systemdb_log.bak
C:\WinRAR\WinRAR.exe a -m4 密码 H:\路径\%fullbakday%systemdb.rar \\IP地址\DBbackup\%fullbakday%systemdb.bak

Del /q Day.vbs


lminz 2021-02-27 18:59:43

引用:

作者: xclimbing (文章 17734586)
上面没仔细看你的说明,确实就如同我所推测的,如果照你这么说,批处理完全可以改成这样:[code] Echo OffEcho NewDate = DateAdd^("d", Wscript.arguments^(1^), Wscript.arguments^(0^)^)>Day.vbsEcho ......

非常感谢你的热心帮助

namejm 2021-02-27 19:51:27

1 个附件
我看到以上代码在获取日期的时候
大都基于批处理 %date% 的结果
这里有个比较致命的陷阱,需要引起各位的注意
那就是 %date% 的结果并不一定就是 yyyy/MM/dd 的格式
有可能是 yy.MM.dd
也有可能是 yy-MM-dd
甚至是丧心病狂的 yy:MM-dd 的格式
这取决于系统中短日期的设置
如果系统中短日期的设置被改动过,可能不会得到期望的结果
如果只是本机使用,这个短日期格式可以自行控制还好
如果想用在别人的机器上
就不一定能得到正确的日期
最好换成其他的方式来获取日期,比如用批处理生成一段vbs代码

短日期的格式在Win7下可以通过以下途径查看/设置:
任务栏中单击时间区域,弹出的对话框中选择 更改日期和时间设置 → 更改日期和时间 → 更改日历 → 区域和语言 → 格式 → 其他设置 → 日期 → 短日期


所有时间均为北京时间, 现在的时间是 16:22:40.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号