Batch file 批处理文件以检查文件';s修改日期,然后将其与另一个日期进行比较
假设我有几个文件的日期修改时间不同。它们中的一些以天为单位,而另一些则以小时或分钟为单位。如何访问日期修改时间,然后比较它们,并按天排序 例如,如果我有以下这组文件:Batch file 批处理文件以检查文件';s修改日期,然后将其与另一个日期进行比较,batch-file,Batch File,假设我有几个文件的日期修改时间不同。它们中的一些以天为单位,而另一些则以小时或分钟为单位。如何访问日期修改时间,然后比较它们,并按天排序 例如,如果我有以下这组文件: Date File 2015/07/29 15:31 A1 2015/07/29 16:00 A2 2015/07/30 15:00 B1 2015/07/30 15:05 B2 我希望输出是: 2015/07/29 16:00 20
Date File
2015/07/29 15:31 A1
2015/07/29 16:00 A2
2015/07/30 15:00 B1
2015/07/30 15:05 B2
我希望输出是:
2015/07/29 16:00
2015/07/30 15:05
如您所见,我不关心文件名,我只想知道每天最后修改日期的时间。请尝试下面的命令,该命令将按文件最后修改日期/时间的顺序列出文件列表
dir /a:-D /O:-D /T:W
与dir命令一起使用的选项说明
/a:-D:将只列出目录中的文件名
/O:-D:将文件按最新日期排序
/T:W:将列出具有上次修改/上次写入时间的文件。请尝试下面的命令,该命令将按文件上次修改日期/时间的排序顺序列出文件列表
dir /a:-D /O:-D /T:W
与dir命令一起使用的选项说明
/a:-D:将只列出目录中的文件名
/O:-D:将文件按最新日期排序
/T:W:将列出具有上次修改/上次写入时间的文件。以下内容将返回唯一修改日期和每天最新时间的列表,最新日期将首先显示:
@echo off
set FOLDER=D:\StackOverflow\BatchTesting
setlocal EnableDelayedExpansion
set PREVIOUS=
for /F "skip=4 tokens=1-2" %%A in ('dir /N /A:-D /O:-D /T:W "%FOLDER%"') do (
if not "%%B"=="File(s)" (
if not "%%B"=="Dir(s)" (
if not "%%A"=="!PREVIOUS!" echo %%A %%B
set PREVIOUS=%%A
)
)
)
endlocal
说明:
这种方法的核心元素是dir
命令,该命令应用于变量folder
给定的文件夹,其输出如下:
Volume in drive D has no label.
Volume Serial Number is 0000-0000
Directory of D:\StackOverflow\BatchTesting
2015/07/31 00:30 12 foo.txt
2015/07/30 20:15 512 bar.txt
2015/07/30 18:45 1'432 somelog.log
2015/07/30 09:00 573 testscpt.bat
2015/07/28 17:10 99 crapfile.tmp
5 File(s) 2'628 bytes
0 Dir(s) 100'000'000'000 bytes free
for
循环解析dir
输出,跳过标题并提取前两个(空格分隔)标记,即日期和时间,一行接一行。设置dir
选项,以便仅列出文件(无目录),并根据修改日期/时间按降序排序
dir /a:-D /O:-D /T:W
两个外部if
语句确保忽略dir
输出的摘要行(如果在非英语系统上工作,则相应调整搜索词)
内部if
语句将当前解析行的日期部分与前一行进行比较,前一行存储在变量previous
中。它的值存储在比较之后,用于下一个循环迭代
因此,该批处理脚本的最终输出(与上述示例一起输入时)将为:
2015/07/31 00:30
2015/07/30 20:15
2015/07/28 17:10
要将输出写入文本文件,请通过重定向调用批处理文件(我们称之为
daytimes.bat
):
daytimes.bat > YourTextFile.txt
以下内容将返回唯一的修改日期和每天的最新时间列表,最新日期将首先显示:
@echo off
set FOLDER=D:\StackOverflow\BatchTesting
setlocal EnableDelayedExpansion
set PREVIOUS=
for /F "skip=4 tokens=1-2" %%A in ('dir /N /A:-D /O:-D /T:W "%FOLDER%"') do (
if not "%%B"=="File(s)" (
if not "%%B"=="Dir(s)" (
if not "%%A"=="!PREVIOUS!" echo %%A %%B
set PREVIOUS=%%A
)
)
)
endlocal
说明:
这种方法的核心元素是dir
命令,该命令应用于变量folder
给定的文件夹,其输出如下:
Volume in drive D has no label.
Volume Serial Number is 0000-0000
Directory of D:\StackOverflow\BatchTesting
2015/07/31 00:30 12 foo.txt
2015/07/30 20:15 512 bar.txt
2015/07/30 18:45 1'432 somelog.log
2015/07/30 09:00 573 testscpt.bat
2015/07/28 17:10 99 crapfile.tmp
5 File(s) 2'628 bytes
0 Dir(s) 100'000'000'000 bytes free
for
循环解析dir
输出,跳过标题并提取前两个(空格分隔)标记,即日期和时间,一行接一行。设置dir
选项,以便仅列出文件(无目录),并根据修改日期/时间按降序排序
dir /a:-D /O:-D /T:W
两个外部if
语句确保忽略dir
输出的摘要行(如果在非英语系统上工作,则相应调整搜索词)
内部if
语句将当前解析行的日期部分与前一行进行比较,前一行存储在变量previous
中。它的值存储在比较之后,用于下一个循环迭代
因此,该批处理脚本的最终输出(与上述示例一起输入时)将为:
2015/07/31 00:30
2015/07/30 20:15
2015/07/28 17:10
要将输出写入文本文件,请通过重定向调用批处理文件(我们称之为
daytimes.bat
):
daytimes.bat > YourTextFile.txt
但就像我在示例输出中发布的一样,我不在乎名称。我只想要时报,不需要删除文件。当然,我可以直接转到文件夹本身,按修改的日期排序,但根据我拥有的文件数量,我不希望这样。我只想让它显示每一天的最后一次,但就像我在示例输出中发布的一样,我不在乎名称。我只想要时报,不需要删除文件。当然,我可以直接转到文件夹本身,按修改的日期排序,但根据我拥有的文件数量,我不希望这样。我只想让它显示每一天的最后一次时间。要将输出写入文本文件,请调用批处理文件(我们称之为
daytimes.bat
),重定向为:daytimes.bat>YourTextFile.txt
。是否有任何方法可以在输出中每天只有一个输出?这是我试图强调的最大问题,似乎没有人意识到。因为我将使用此代码的文件夹有1000多个文件,所以像这样对其进行排序会有点困难。我完成了回答,提供了与dir
示例相关的输出,并添加了将其放入文本文件的方法。我想,这正是您想要的(如果我错了,请告诉我)。要将输出写入文本文件,请调用批处理文件(我们称之为daytimes.bat
),并重定向:daytimes.bat>YourTextFile.txt
。是否有任何方法可以让我在输出中每天只有一个输出?这是我试图强调的最大问题,似乎没有人意识到。因为我将使用此代码的文件夹有1000多个文件,所以像这样对其进行排序会有点困难。我完成了回答,提供了与dir
示例相关的输出,并添加了将其放入文本文件的方法。我想,这正是你想要的(如果我错了,请告诉我)。