整天都在做研究,我可能已经手动完成了这项工作,但我只是想学习如何扩展我的知识
要求: 我有一个包含11xxx子文件夹的文件夹,我需要知道每个子文件夹中最旧的文件何时被上次修改
到目前为止,我尝试使用dir命令获取所有文件夹的列表以及文件夹中每个文件的最后修改日期
echo Starting...
@echo off
if exist files.txt (del files.txt)
dir /on /s /tw /a-d | find /v "<DIR> ." | find /v "File(s)" > files.txt
if exist files1.txt (del files1.txt)
For /F "delims=" %%A in (files.txt) Do Echo %%A >> files1.txt
if exist files2.txt (del files2.txt)
For /F "skip=2 delims=*" %%A in (files1.txt) Do Echo %%A >> files2.txt
@echo on
echo Finishing...
del files.txt
del files1.txt
ren files2.txt files.txt
quit
好的,所以上面给了我一个这种格式的txt文件
Directory of C:\TEMP
2013/12/05 05:30 PM 22,528 6N85.mst
2011/06/21 12:01 PM 14,108,096 CitrixOnlinePluginWeb.exe
2014/02/19 01:59 PM 448 extract.cmd
2014/02/19 03:42 PM 0 files.txt
2011/08/04 08:41 AM 216 GLF1C8.tmp
2011/08/04 08:41 AM 2,630 GLF1C9.tmp
2011/08/04 08:41 AM 54 GLF1CA.tmp
2011/08/04 08:41 AM 64 GLF1CB.tmp
2011/07/05 12:29 PM 239,174 ITMURebootMSG.EXE
2013/11/28 04:20 PM 2,434,048 msxml.msi
2013/11/28 12:59 PM 2,066,376 msxml4-KB2758694-enu.exe
2004/04/15 10:10 AM 79 process.bat
2012/08/02 12:43 AM 4,594 process.log
2003/11/04 10:17 AM 376 procs.vbs
2014/02/18 03:32 AM 16,391 WakeUpAgt.LO_
2014/02/19 12:04 PM 9,247 WakeUpAgt.LOG
2005/03/09 09:40 AM 4,630,256 WindowsXP-KB895200-x86-ENU.exe
2005/10/12 02:06 PM 4,934,896 WINDOWSXP-KB902400-X86-ENU.exe
2006/05/25 12:12 PM 1,307,376 WindowsXP-KB913580-x86-ENU.exe
Total Files Listed:
0 Dir(s) 81,741,336,576 bytes free
我在excel中打开了txt文件以获取每行的前10个字符以获得col A中的日期,
IMO这种做法是错误的,也许我应该以不同的方式做到这一点,任何人都在关心帮助?
答案 0 :(得分:3)
你走在正确的轨道上。您找到的内置dir
命令可以为您排序。如果您只关心最旧文件的日期,请按修改日期(降序)排序,并获取列表中的最后一个条目。我认为这应该做你想要的事情:
for /f %%x in ('dir /b /o-d /a-d') do set OLDESTFILE=%%~fx last modified at %%~tx
echo %OLDESTFILE%
让我打破这个。
切换到dir
命令会以“简短”的形式(/a-d
为您提供仅(/b
)的文件列表 - 只需一个文件列表,而不是典型的完整dir
输出),并将按日期,降序(/o-d
)对该列表进行排序。
包裹的for
循环遍历每个文件并将环境变量设置为以下格式的文本:
C:\TEMP\WindowsXP-KB913580-x86-END.exe last modified at 2006/05/25 12:12 PM
您可以阅读for /?
,了解您可以使用的其他~
修饰符的所有细节。
如果使用echo on
运行它,您将看到它实际上每次都通过循环设置此环境变量,并在每次后续迭代时覆盖它。不过,我们还可以,因为我们真的只想要最后一个条目。
现在,如果你真的只想要日期而不是时间,那就有点棘手了。你需要使用一个稍微丑陋的循环:
for /f %%x in ('dir /b /o-d /a-d') do (
for /f "tokens=1" %%a in ("%%~tx") do (
set OLDESTFILE=%%~fx last modified on %%a
)
)
echo %OLDESTFILE%
这里的内部for
循环将日期和时间(例如2006/05/24 12:12
)作为参数列表。由于cmd
默认使用空格作为分隔符,因此会为您提供两个令牌,2006/05/24
和12:12
。通过指定tokens=1
,您明确告诉for
您只关心其中的第一个:日期*。
希望这能让你走上正轨。现在您有了棘手的部分,您可以将所有这些包装在一个循环中,该循环可以获取您需要运行它的目录列表。
*
迂腐地说,你实际上并不需要那里的tokens=1
,因为%%a
无论如何只会引用第一个标记,时间将在{{1} },但我认为这对于说明目的很有用。
答案 1 :(得分:0)
首先,谢谢@Mark帮助我理解dos中的for循环,昨天我遇到了麻烦,我只是弄清楚它们是如何工作的,但现在我觉得我明白了!
我在%%~tx
找到的问题之一是它没有提取最后修改日期,只提取最后一次访问日期,也许我错了,但我想我会尝试不同的方法anwyay < / p>
::delete any files called list.txt if they exist
if exist list.txt (del list.txt)
::loop through all directories including sub-directories
for /d /r %%x in (*) do (
if exist listTemp1.txt (del listTemp1.txt)
::loop through each file within directory, show time last written, sort desc
for /f "delims=" %%y in ('dir "%%x" /tw /o-d') do (
::append listTemp1.txt with list of files
echo %%y >> listTemp1.txt
)
if exist listTemp2.txt (del listTemp2.txt)
::append listTemp2.txt with lines containing / in the dates
find "/" listTemp1.txt >> listTemp2.txt
::loop through listTemp2.txt to get last line of file, no delims as the first space is after date and we only need date, set var OLDFile with date and current folder
for /f %%z in (listTemp2.txt) do set OLDFile=%%z %%x
::append list.txt with OLDFile
call echo %%OLDFile%% >> list.txt
)
if exist listTemp1.txt (del listTemp1.txt)
if exist listTemp2.txt (del listTemp2.txt)
上面的脚本给了我想要的确切结果,即<date of oldest file within folder> <folder>
2014/02/20 C:\TEMP\folder 1
2014/02/19 C:\TEMP\folder 2
2014/02/19 C:\TEMP\folder 1\folder 2
我创建了临时的txt文件,因为我无法管道循环结果(可能吗?)
无论如何,再次感谢@Mark,如果没有你的帮助示例,最好不知道如何做到这一点,最重要的是帮助我理解代码的分解!