你是如何使用批处理脚本删除文件夹中的最新文件的?批处理文件删除最新文件
我发现的所有结果只显示如何删除最旧的文件或在N天后删除它们。
链接是:Batch file to delete files older than N days和Batch Script to delete oldest folder in a given folder
谢谢
你是如何使用批处理脚本删除文件夹中的最新文件的?批处理文件删除最新文件
我发现的所有结果只显示如何删除最旧的文件或在N天后删除它们。
链接是:Batch file to delete files older than N days和Batch Script to delete oldest folder in a given folder
谢谢
我这样做:
@echo off
set latest=
set the_directory=your_directory
for /F %%a in ('dir /B /OD /A-D %the_directory%') do set latest=%%a
del %the_directory%\%latest%
仅文件运行dir
,对修改日期排序。然后循环并保留最后一个回显文件。删除它(通过echo
更换测试!)
下面的代码片段你想要做什么:
set "FILE="
pushd "\path\to\folder" || exit /B 1
for /F "eol=| delims=" %%F in ('
dir /B /A:-D /O:D /T:C "*.*"
') do (
set "FILE=%%F"
)
if defined FILE del "%FILE%"
popd
的dir
命令仅返回(/A:-D
)按日期升序(/O:D
)排序利用文件创建日期(/T:C
),它们位于\path\to\folder
并匹配*.*
的模式。
for /F
循环遍历所有由dir
返回的文件,并将其名称分配给变量FILE
,在每次迭代中覆盖它,因此最终值是最新文件的名称。 del
命令最后删除找到的文件。 if
查询涵盖在给定位置没有找到文件的情况。
这里所推荐的脱线的comment略微修改的变体,这可能是比上述一个更高性能的一点:
set "FILE="
pushd "\path\to\folder" || exit /B 1
for /F "eol=| delims=" %%F in ('
dir /B /A:-D /O:-D /T:C "*.*"
') do (
if not defined FILE set "FILE=%%F"
)
if defined FILE del "%FILE%"
popd
这避免了通过查询其是否具有multiplicately覆盖变量FILE
的已被定义。请注意这里的反向排序顺序dir
。
但是,Magoo的answer中显示的方法在性能上仍然更好。
for /F %%a in ('dir /B /O-D /A-D %the_directory%') do echo("%the_directory%\%%a"&goto deldone
:deldone
将是我的方法。它粗暴地从for
循环中删除了在排序逆向日期顺序(/o-d
)列表中遇到的第一个文件名。
这节省了必须读取整个列表。没有几个文件存在这样的问题,但可能会带来数千人的痛苦。
为了测试目的,所需的DEL命令仅仅是ECHO
。 验证命令是否正确后,将ECHO(DEL
更改为DEL
以实际删除文件。
我也想到了这种方法,但虽然性能肯定会更好,但我决定不在这里使用它,因为如果插入到脚本中,以防将其置于另一个括号内的代码块中,可能会导致麻烦。 。 – aschipfl
@aschipfl:够公平的,但有限制。用你的例子,你可能会用'如果未定义的文件集'文件= %% F“'获得更好的性能。 – Magoo
啊,是的,查询变量可能会比多次覆盖它更快,谢谢! – aschipfl