批處理文件以刪除超過N天的文件

我正在尋找一種刪除批處理文件中全部7天以上的文件的方法。 我在網上搜索,發現了一些包含數百行代碼的示例,還有一些示例須要安裝額外的命令行實用程序才能完成任務。 sql

只需幾行代碼便可在BASH完成相似的操做。 彷佛能夠對Windows中的批處理文件至少進行一些遠程操做。 我正在尋找一種能夠在標準Windows命令提示符下運行且沒有任何其餘實用程序的解決方案。 請不要使用PowerShell或Cygwin。 編輯器


#1樓

對於Windows Server 2008 R2: 函數

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

這將刪除全部超過90天的.sql文件。 ui


#2樓

Ok有點無聊,並提出了這個建議,其中包含個人一個窮人的Linux時代替代版本,該版本僅限於平常使用(無時間限制): 編碼

7天清理 spa

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

用法

set /a strip=day*7 :將7更改成要保留的天數。 命令行

set dSource=C:\\temp :這是檢查文件的起始目錄。 debug

筆記

這是非破壞性的代碼,它將顯示會發生的狀況。 code

變動: token

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

到這樣的東西:

if !epoch! LEQ %slice% del /f %%f

所以實際上刪除了文件

2月 :硬編碼爲28天。 難忘的歲月真是使人難以置信。 若是有人有想法不添加10行代碼,請繼續發佈,以便將其添加到個人代碼中。

紀元 :我沒有考慮時間,由於須要刪除早於某個特定日期的文件,若是花費數小時/分鐘,就會從本來打算保留的日期刪除文件。

侷限性

紀元認爲您的短日期格式是YYYY-MM-DD。 須要將其調整爲其餘設置或運行時評估(讀取sShortTime,用戶綁定配置,在過濾器中配置適當的字段順序並使用過濾器從參數中提取正確的數據)。

我是否提到我討厭該編輯器的自動格式化? 它刪除了空白行,而且複製粘貼是一個地獄。

我但願這有幫助。


#3樓

看看個人回答到一個相似的問題

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

這將刪除早於給定日期的文件。 我肯定能夠將其修改成從當前日期返回7天。

更新:我注意到HerbCSO在上述腳本上有所改進。 我建議改用他的版本


#4樓

IMO,JavaScript正在逐漸成爲一種通用的腳本標準:它可能在比其餘任何腳本語言都更多的產品中可用(在Windows中,可使用Windows Scripting Host得到)。 我必須清理許多文件夾中的舊文件,所以這是一個JavaScript函數:

// run from an administrator command prompt (or from task scheduler with full rights):  wscript jscript.js
// debug with:   wscript /d /x jscript.js

var fs = WScript.CreateObject("Scripting.FileSystemObject");

clearFolder('C:\\temp\\cleanup');

function clearFolder(folderPath)
{
    // calculate date 3 days ago
    var dateNow = new Date();
    var dateTest = new Date();
    dateTest.setDate(dateNow.getDate() - 3);

    var folder = fs.GetFolder(folderPath);
    var files = folder.Files;

    for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
    {
        var file = it.item();

        if( file.DateLastModified < dateTest)
        {
            var filename = file.name;
            var ext = filename.split('.').pop().toLowerCase();

            if (ext != 'exe' && ext != 'dll')
            {
                file.Delete(true);
            }
        }
    }

    var subfolders = new Enumerator(folder.SubFolders);
    for (; !subfolders.atEnd(); subfolders.moveNext())
    {
        clearFolder(subfolders.item().Path);
    }
}

對於每一個要清除的文件夾,只需將另外一個調用添加到clearFolder()函數便可。 此特定代碼還保留exe和dll文件,並清除子文件夾。


#5樓

這沒什麼了不得的,可是我今天須要作這樣的事情並將其做爲計劃任務運行,等等。

批處理文件DelFilesOlderThanNDays.bat下面帶有示例exec w / params:

DelFilesOlderThanNDays.bat 7 C:\\ dir1 \\ dir2 \\ dir3 \\ logs * .log

echo off
cls
Echo(
SET keepDD=%1
SET logPath=%2 :: example C:\dir1\dir2\dir3\logs
SET logFileExt=%3
SET check=0
IF [%3] EQU [] SET logFileExt=*.log & echo: file extention not specified (default set to "*.log")
IF [%2] EQU [] echo: file directory no specified (a required parameter), exiting! & EXIT /B 
IF [%1] EQU [] echo: number of days not specified? :)
echo(
echo: in path [ %logPath% ]
echo: finding all files like [ %logFileExt% ]
echo: older than [ %keepDD% ] days
echo(
::
::
:: LOG
echo:  >> c:\trimLogFiles\logBat\log.txt
echo: executed on %DATE% %TIME% >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
echo: in path [ %logPath% ] >> c:\trimLogFiles\logBat\log.txt
echo: finding all files like [ %logFileExt% ] >> c:\trimLogFiles\logBat\log.txt
echo: older than [ %keepDD% ] days >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
::
FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" >> c:\trimLogFiles\logBat\log.txt 2<&1
IF %ERRORLEVEL% EQU 0 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path"
)
::
::
:: LOG
IF %ERRORLEVEL% EQU 0 (
 echo:  >> c:\trimLogFiles\logBat\log.txt
 echo: deleting files ... >> c:\trimLogFiles\logBat\log.txt
 echo:  >> c:\trimLogFiles\logBat\log.txt
 SET check=1
)
::
::
IF %check% EQU 1 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c del @path"
)
::
:: RETURN & LOG
::
IF %ERRORLEVEL% EQU 0 echo: deletion successfull! & echo: deletion successfull! >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
相關文章
相關標籤/搜索