将X量的文件保存在文件夹中,用于文件

时间:2016-01-15 12:02:26

标签: windows batch-file for-loop cmd

我想保留文件夹中的X最新文件并删除其余文件。这可能是FORFILES吗?如果不是,我可以回到我在这里看到的另一个解决方案。谢谢你的帮助。

我这样做了,但需要按日期:编辑

forfiles /p [path] /s /d -5 /c "cmd /c echo @file"

(用于测试目的的echo文件)

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "targetdir=U:\destdir"
SET /a retain=10

FOR /f "skip=%retain%delims=" %%a IN (
 'dir /b /a-d /o-d "%targetdir%\*" '
 ) DO ECHO (DEL "%targetdir%\%%a"

GOTO :EOF

您需要更改targetdir的设置以适合您的具体情况。同样,此过程针对所有文件 - 更改文件掩码以适应。

为了测试目的,所需的DEL命令仅为ECHO在您确认命令正确后,将ECHO(DEL更改为DEL以实际删除文件。

方法是简单地在没有目录的基本形式中执行dir,按反向日期顺序排序。

跳过前10个条目,删除其余条目。

答案 1 :(得分:0)

使用forfiles我认为没有机会完成返回最新(最新)数量文件的任务。

所以我对这种方法的想法是:

  • 使用dir /B /A:-D /T:C /O:-D检索文件的裸列表(/B)(无目录,/A:-D),按创建日期(/T:C排序;如果您愿意使用最后修改日期,只需按降序排列/T:C部分)(/O:-D),这意味着最新的项目;
  • 放置一个for /F "eol=| delims="循环来逐行收集和解析dir输出,这意味着逐个文件,不包括以;开头的文件名(eol=||对于文件名是非法的)并且不拆分包含空格的文件名,如 SPACE TAB delims=);
  • 建立构成计数器的变量,每次循环迭代递增;
  • 在循环内放置if条件以检查计数器是否达到所需的限制数,如果已满足,则将for /F循环中断goto; < / LI>

以下是相关代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Define global constants here:
set "TARGETPATH=\path\to\files\*.*"
set /A "TOTAL=10"

set /A "COUNT=0"
for /F "eol=| delims=" %%F in ('
    dir /B /A:-D /T:C /O:-D "%TARGETPATH%"
') do (
    echo(%%F
    set /A COUNT+=1
    setlocal EnableDelayedExpansion
    if !COUNT! GEQ %TOTAL% (
        endlocal
        goto :NEXT
    ) else (
        endlocal
    )
)
:NEXT
endlocal
exit /B

我切换了for /F循环中的delayed variable expansion,以避免在文件名包含感叹号!的情况下出现问题,如果感叹号echo(%%F会在@echo off setlocal EnableExtensions DisableDelayedExpansion rem Define global constants here: set "TARGETPATH=\path\to\files\*.*" set /A "TOTAL=10" set "SKIPOPT=" & if %TOTAL% GTR 0 set "SKIPOPT=skip=%TOTAL% " for /F "%SKIPOPT%eol=| delims=" %%F in (' dir /B /A:-D /T:C /O:-D "%TARGETPATH%" ') do ( del /P "%%F" ) endlocal exit /B 行中丢失是的。

更新

以下代码完成了您问题的原始任务,即删除给定目录中的文件,但保留最新数量的文件:

for /F

由于skip=支持SKIPOPT跳过给定行数,以及我们情况下的文件,让我们使用它。它通过变量skip=10在此间接给出,它保存整个选项字符串,如TOTAL(假设10设置为if %TOTAL% GTR 0)。如果TOTAL0,则for /F查询是针对脚本实现的,因为skip=0不接受/P选项。

del命令的Delete (Y/N)?开关会出现提示echo "Its Me at SO" <=> "Its Me at SO"; 以进行测试。如果您不想要任何提示,只需将其删除即可。