CMD / BAT - 帮助确定日期36天前

时间:2009-08-20 19:49:25

标签: command-line date batch-file

每晚我需要在当前日期36天的文件夹上工作。我有一个系统将文件写入如下的日常结构。我需要在本地磁盘上保留35天的价值,所以每晚我需要在第36天归档。这是踢球者......每天大约有200万个文件,所以我无法有效扫描整个2009文件夹,只能移动超过35天的文件。我需要做的是,批处理脚本确定36天之前的文件夹的路径,然后应用我的存档逻辑。我有脚本来确定但是在36天之前做出决定时遇到了麻烦。如果没有批处理方式,我可以使用perl。 --Shawn

文件夹结构如下:

2009\07\01
2009\07\02
2009\07\03
.
.
.
2009\08\01
2009\08\02
2009\08\03

@EDIT:海伦的好回答让我有99%的回答。我唯一的问题是vbs的月和日没有填充零,我必须在文件夹结构中处理。如果日期或月份小于10,是否有人可以轻松填充前导0?

到目前为止我正在做的事情:

for /F "tokens=1-3 delims=/" %%x in ('cscript //nologo get36thday.vbs') do (
   SET YYYY=%%z
   SET MM=%%x
   SET DD=%%y)

除了%MM%最终为7而不是07

3 个答案:

答案 0 :(得分:1)

批处理选项是非常邪恶的,你需要计算它是哪个月的运行时间循环倒计时。我会高度推荐perl,因为它会是几行代码

使用CPAN的DateTime模块

http://search.cpan.org/dist/DateTime/lib/DateTime.pm

my $dt = DateTime->now->subtract(days => 36);

答案 1 :(得分:0)

确定日期的批处理方式太复杂了;使用脚本要容易得多。对不起,没有Perl示例,只有一个VBScript:

WScript.Echo DateAdd("d", Date, -36)

您可以从批处理文件中调用此脚本,并按如下方式读取计算日期:

for /f %%d in ('cscript //nologo datediff.vbs') do set dt=%%d

答案 2 :(得分:0)

如果你像我这样跟谷歌来这里:
要修复.vbs中的前导零,我在前面添加一个零并删除右边的2个字符 “0”& “7” - > “07”和“0”& “14” - > “14”

OldDateCode.vbs:

OldDate = DateAdd("d", Date, -36)
DateCode = Year(OldDate) & Right("0" & Month(OldDate), 2) & Right("0" & Day(OldDate), 2)
WScript.Echo DateCode

我还想保留当月的第一个文件夹,以便将最后2位数(天)与“01”进行比较 检查第一天的VBS代码:

If Right(DateCode, 2)="01" then
  WScript.Echo "The 1st:" & vbCrLf & DateCode
Else
  WScript.Echo "Not the 1st:" & vbCrLf & DateCode
End If

CheckDate.bat:

@Echo Off
Set Folder=D:

for /f %%d in ('cscript //nologo OldDateCode.vbs') do set OldDateCode=%%d

If "%OldDateCode:~6,7%"=="01" (
  Echo "Old Backup: %OldDateCode% 1st of the month: keeping..."
) ELSE (
  Echo "Old Backup: %OldDateCode% not the 1st of the month: removing..."
  RD /S /Q "%Folder%\%OldDateCode%"
)
pause

在D:\中创建一个文件夹,日期代码为36天前。使用-36和日期代码。