2016-11-05 102 views

回答

1

我这样做:

@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更换测试!)

1

下面的代码片段你想要做什么:

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中显示的方法在性能上仍然更好。

2
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以实际删除文件。

+0

我也想到了这种方法,但虽然性能肯定会更好,但我决定不在这里使用它,因为如果插入到脚本中,以防将其置于另一个括号内的代码块中,可能会导致麻烦。 。 – aschipfl

+0

@aschipfl:够公平的,但有限制。用你的例子,你可能会用'如果未定义的文件集'文件= %% F“'获得更好的性能。 – Magoo

+0

啊,是的,查询变量可能会比多次覆盖它更快,谢谢! – aschipfl