将7个最新文件保存在文件夹中的批处理文件

时间:2012-11-13 19:54:24

标签: file batch-file delete-file

有人可以帮我创建批处理文件吗?基本上,我的目标是创建一个批处理文件,该文件将保留文件夹中的最新7 .txt文件(换句话说,最新),然后删除其余文件。那是因为文件夹中有超过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% 

感谢任何帮助。

3 个答案:

答案 0 :(得分:29)

您可以将DIR与/O-D一起使用,以降序时间戳顺序列出文本文件。 FOR / F允许您迭代每个文件。 SET / A用于跟踪到目前为止已列出的文件数。现在是棘手的部分。

在代码块中,您通常需要使用延迟扩展来处理先前在同一块中设置的变量的值。但是,如果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"

您甚至不需要批处理文件。如果从命令提示符运行,只需将%%更改为%

答案 1 :(得分:2)

下面的批处理文件使用更简单的方法。它使用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"
)

安东尼奥

答案 2 :(得分:0)

这将保留7个最新的.txt文件并删除所有其他.txt文件

在要删除文件的同一目录中执行以下命令

在命令提示符

<?php
$login_response = array();

$user = $db->getUserByUsernameAndPassword($username, $password);

if ($user != null) {
    // user is found
    $login_response["error"] = FALSE;
    $login_response["user"]["br_code"] = $user["MEMBER_ID_BRCODE"];
    $login_response["user"]["mem_id"] = $user["MEMBER_ID"];
    $login_response["user"]["username"] = $user["USERNAME"];
    $login_response["user"]["email"] = $user["EMAIL"];
    $login_response["user"]["created_at"] = $user["REG_DATE"];

    // FOR SL SUMM
    $user_sldtl = $db->getUserSLsummary($arclass, $loanclass, $accintreceivable, $date, $year, $month, $br_code, $clientid);

    $sl_response = array();
    If($user_sldtl != null) {
        $sl_response["error"] = FALSE;
        $sl_response["sl_summ"] = array();
        foreach ($user_sldtl as $dtl)){
            $item = array();
            $item["sl_desc"] = $dtl[7];
            $item["tr_date"] = $dtl[10];
            $item["actual_balance"] = $dtl[14];
            $item["available_balance"] = $dtl[14];

            $sl_response["sl_summ"][] = $item;
        }
    }
    else {
        $sl_response["error"] = TRUE;
        $sl_response["error_msg"] = "NO SL Details found!";
    }
    $response = array("login" => $login_response, "accounts" => $sl_response);
}
else {
    // user is not found with the credentials
    $login_response["error"] = TRUE;
    $login_response["error_msg"] = "Login credentials are wrong. Please try again!";
    $response = array("login" => $login_response);
}

echo json_encode($response);

内部批处理脚本

for /f "skip=7 eol=: delims=" %F in ('dir /b /o-d /a-d *.txt') do @del "%F"