[英]Batch file that keeps the 7 latest files in a folder
谁能帮我创建一个批处理文件? 基本上,我的目标是创建一个批处理文件,将最新的 7.txt 文件(换句话说,最新的)保存在文件夹中,然后删除 rest。 那是如果文件夹中有超过 7 个文件。
我现在遇到的问题是,我创建的批处理文件删除了大部分文件,因为它们的日期是一两个月左右。 我想始终保留最新的 7 个文件,无论它们有多旧。
所以这就是我所拥有的 -
@echo off
setlocal enableextensions
rem ********************************************************************************
rem ******************************* LOCAL VARIABLES ******************************
rem ********************************************************************************
SET TargetDirectory="C:\TEMP\test"
SET No_of_fles_to_keep=7
SET count=0
set cnt=0
rem ********************************************************************************
cd /d %TargetDirectory%
REM timeout /T 500
for %%x in (*) do set /a count+=1
for %%A in (*.bat) do set /a cnt+=1
cd /d %TargetDirectory%
REM timeout /T 500
IF %count% gtr %No_of_fles_to_keep% forfiles -p %TargetDirectory% -s -m "*.txt" -d -%No_of_fles_to_keep% -c "cmd /c del @path"
echo %count%
echo File count = %cnt%
任何帮助表示赞赏。
您可以将DIR与/OD
一起使用,以降序时间戳顺序列出文本文件。 FOR / F允许您迭代每个文件。 SET / A用于跟踪到目前为止已列出的文件数。 现在是棘手的部分。
在代码块中,通常需要使用延迟扩展来处理先前在同一块中设置的变量的值。 但是如果FOR变量值包含FOR,则延迟扩展会导致FOR循环出现问题!
,和!
在文件名中有效。 我通过使用SET / A在读取第7个文件名时故意除以0来解决问题。 这会引发一个错误,导致条件代码执行时取消定义KEEP变量。 从那时起,所有剩余的文件都将被删除。
@echo off
setlocal
set /a cnt=0
set "keep=7"
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do (
if defined keep (
2>nul set /a "cnt+=1, 1/(keep-cnt)" || set "keep="
) else del "%%F"
)
更新
哦,天哪,我才意识到有一个简单的解决方案。 只需使用FOR / F SKIP选项忽略按上次修改日期排序后的前7个条目,即降序。
for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F"
您甚至不需要批处理文件。 如果从命令提示符运行,只需将%%
更改为%
。
下面的批处理文件使用更简单的方法。 它使用findstr /N "^"
命令对每个文件进行编号,然后它只比较每个数字以保留前七个文件并删除其余文件...
@echo off
for /f "tokens=1* delims=:" %%a in ('dir /b /o-d *.txt ^| findstr /N "^"') do (
if %%a gtr 7 del "%%b"
)
安东尼奥
这将保留7个最新的.txt文件并删除所有其他.txt文件
在要从中删除文件的同一目录中执行以下命令
在命令提示符下
for /f "skip=7 eol=: delims=" %F in ('dir /b /o-d /a-d *.txt') do @del "%F"
内部批处理脚本
for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F"
如果您不经常编写 DOS 脚本,而我不这样做,这里是其他人注意到的总结。 此处的其他示例将需要您要从中删除的同一文件夹中的批处理文件。 要从另一个路径中删除:(请注意,您必须将路径添加到搜索和删除中两次)
SET targetDir="C:\Test\Files\"
for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d %targetDir%*.txt') do @del "%targetDir%""%%F"
感谢@dbenham、@SmileyFace、@user2924127 以及所有其他帮助提供答案的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.