每晚我需要在当前日期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
答案 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和日期代码。