2008-11-27 33 views
11

thể trùng lặp:
Batch file to delete files older than N daysđể xóa các tập tin cũ hơn một ngày cụ thể

Làm thế nào để tạo ra một tập tin batch để xóa các tập tin cũ hơn một ngày cụ thể?

Điều này dường như không hoạt động;

:: --------DELOLD.BAT---------- 
@echo off 
SET OLDERTHAN=%1 
IF NOT DEFINED OLDERTHAN GOTO SYNTAX 

for /f "tokens=2" %%i in ('date /t') do set thedate=%%i 
type %1 
pause 
set mm=%thedate:~0,2% 
set dd=%thedate:~3,2% 
set yyyy=%thedate:~6,4% 

set /A dd=%dd% - %OLDERTHAN% 
set /A mm=%mm% + 0 

if /I %dd% GTR 0 goto DONE 
set /A mm=%mm% - 1 
if /I %mm% GTR 0 goto ADJUSTDAY 
set /A mm=12 
set /A yyyy=%yyyy% - 1 

:ADJUSTDAY 
if %mm%==1 goto SET31 
if %mm%==2 goto LEAPCHK 
if %mm%==3 goto SET31 
if %mm%==4 goto SET30 
if %mm%==5 goto SET31 
if %mm%==6 goto SET30 
if %mm%==7 goto SET31 
if %mm%==8 goto SET31 
if %mm%==9 goto SET30 
if %mm%==10 goto SET31 
if %mm%==11 goto SET30 
if %mm%==12 goto SET31 

goto ERROR 

:SET31 
set /A dd=31 + %dd% 
goto DONE 

:SET30 
set /A dd=30 + %dd% 
goto DONE 

:LEAPCHK 
set /A tt=%yyyy% %% 4 
if not %tt%==0 goto SET28 
set /A tt=%yyyy% %% 100 
if not %tt%==0 goto SET29 
set /A tt=%yyyy% %% 400 
if %tt%==0 goto SET29 

:SET28 
set /A dd=28 + %dd% 
goto DONE 

:SET29 
set /A dd=29 + %dd% 

:DONE 
if /i %dd% LSS 10 set dd=0%dd% 
if /I %mm% LSS 10 set mm=0%mm% 
for %%i in (*.*) do (
set FileName=%%i 
call :PROCESSFILE %%~ti 
) 

set mm= 
set yyyy= 
set dd= 
set thedate= 
goto EXIT 

:SYNTAX 
ECHO. 
ECHO USAGE: 
ECHO DELOLD X 
ECHO Where X is the number of days previous to Today. 
ECHO. 
ECHO EX: "DELOLD 5" Deletes files older than 5 days. 
GOTO EXIT 

:PROCESSFILE 
set temp=%1 
set fyyyy=20%temp:~6% 
set fmm=%temp:~0,2% 
set fdd=%temp:~3,2% 
if /I %fyyyy% GTR 2069 set fyyyy=19%temp:~6% 


:: *************************************** 
:: * This is where the files are deleted * 
:: * Change the ECHO command to DEL to * 
:: * delete. ECHO is used for test.  * 
:: *************************************** 
if /I %yyyy%/%mm%/%dd% GEQ %fyyyy%/%fmm%/%fdd% (
ECHO %FileName% 
) 

set temp= 
set fyyyy= 
set fmm= 
set fdd= 

:EXIT 

:: ----------END-DELOLD.BAT------------- 
+0

Một phương pháp mới có trong tệp .BAT sử dụng lệnh CMD.EXE nội bộ chỉ được đăng ở đây: http://stackoverflow.com/questions/9746778/ms-dos-batch-delete-old-files-in -directory/9747065 # 9747065 – Aacini

Trả lời

-1

Tôi không biết nếu bạn có thể làm điều đó với các file .BAT và những gì vài công cụ Windows đi kèm với, nhưng bạn chắc chắn có thể với .js (JScript) hoặc .vbs (VBScript) tập tin. Bạn đang làm điều này dưới Windows, phải không? Nếu vậy, Windows có thể xử lý các tệp .js và .vbs cũng như các tệp .bat theo mặc định. Chúng mạnh hơn rất nhiều.

Và nếu bạn tình cờ chỉ nhắm mục tiêu Windows Server 2008, PowerShell còn tốt hơn (có thể tải xuống cho các phiên bản Windows khác).

+0

Xem http://stackoverflow.com/a/51069/283863 –

+0

Um ... Tôi đã không cho bạn downvote đó. Nhưng tôi nghĩ đó là bởi vì điều này giống như một bình luận * hơn là một câu trả lời *. –

+0

@Derek - Ồ, được rồi. Lấy làm tiếc. :) –

0

Tôi tự hỏi tại sao bạn phải sử dụng vỏ DOS ole ... Python hoặc Windows Powershell sẽ là lựa chọn đúng đắn trong năm 2008 :)

+0

Anh ấy đang sử dụng set/a. Không có cách nào có thể làm việc trong DOS. Vì vậy, ông sử dụng cmd, thực sự vẫn là một lựa chọn rất lành mạnh (ngay cả khi cồng kềnh), vì nó là thứ duy nhất hoạt động trên mọi Windows (ngoại trừ WSH, nhưng có thể bị khóa với chính sách nhóm). – Joey

6

Edit: I figured it out.

Để xóa tất cả các file lớn hơn một ngày nhất định:

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"

Để xóa tất cả các file mới hơn một ngày nhất định:

REM del_new.bat 
REM usage: del_new MM-DD-YYYY 
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist "%%~nxa" del "%%~nxa"
9

tôi sử dụng kịch bản này:

//////////////////////////////////////////////////////// 
// Deletes file older than a number of days 
// in the current directory 
//////////////////////////////////////////////////////// 
// Usage: wscript DeleteOlderThan.js [#Days] 
// By default, remove files older than 30 days 
//////////////////////////////////////////////////////// 

function removeDays(date, nDays) 
{ 
    var dateRet = date 
    return dateRet.setDate(date.getDate() - nDays); 
} 

function addSlash(strPath) 
{ 
    var c = strPath.substr(-1, 1); 
    if(c !== '\\' && c !== '/') 
    { 
     strPath += '\\'; 
    } 
    return strPath; 
} 

// Read arguments 
var nDays = WScript.Arguments(0) || 30; 

// Create system objects 
var fs = WScript.CreateObject("Scripting.FileSystemObject"); 
var shell = WScript.CreateObject("WScript.Shell"); 

// Retrieve current directory 
var strDirectoryPath = addSlash(shell.CurrentDirectory); 

// Compute date 
var dateNow = new Date(); 
var dateTest = removeDays(dateNow, nDays); 

// Iterate on files 
var folder = fs.GetFolder(strDirectoryPath); 
var files = folder.Files; 

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

    if(file.DateLastModified < dateTest) 
    { 
     file.Delete(true); 
    } 
} 

mà tôi gọi mỗi ngày với:

wscript "C:\Program Files\Utils\DeletesOlderThan.js" 30 
1

Giải pháp của tôi hoạt động nếu bạn

  • hoặc có một tiện ích touch trên hệ thống của bạn (mà tôi làm)
  • hoặc có thể đủ khả năng để tạm thời thay đổi ngày hệ thống sử dụng date lệnh (mà có lẽ không phải như vậy, nhưng ai mà biết được)

Dưới đây là ý tưởng:

  1. Trong thư mục đích, tạo một tập tin tín hiệu (với một tên duy nhất), và với dấu thời gian bằng với thời gian ngưỡng xóa của bạn. Nó có thể được thực hiện với touch (chấp nhận dấu thời gian mong muốn làm tham số) hoặc bằng cách nhớ ngày hiện tại với date /T, thay đổi ngày hệ thống thành mong muốn với date <param> và khôi phục ngày ban đầu.

  2. Sử dụng for /f %%I in ('dir /od') để lặp qua tất cả các tệp được sắp xếp theo ngày, xóa từng tệp một. Sau khi bạn gặp (và xóa) tập tin tín hiệu, hãy ngừng xóa.

+1

Điều này có vẻ như một cách tiếp cận cực kỳ nguy hiểm so với các câu trả lời khác ở đây. – Dan

+0

@Dan Nếu bạn đang đề cập đến khả năng một cái gì đó sẽ lộn xộn với các tập tin tín hiệu, nó có thể được bảo vệ chống lại bằng cách tách (2) thành hai giai đoạn: ** 2.1 ** xây dựng kịch bản bằng cách chạy vòng lặp như trên, echoing del lệnh với tên tập tin vào một tập tin tạm thời; ** 2.2 ** gọi cho biết tập tin tạm thời, nhưng chỉ khi bạn gặp phải tập tin tín hiệu của bạn. Nếu không, hãy hủy bỏ. Dù sao, giải pháp này là một kludge, tất nhiên. – atzz

+1

Tôi chỉ nghĩ nếu bạn vô tình ra lệnh cho các tập tin không chính xác, bạn có thể xóa hàng ngàn tập tin trước khi đến tập tin tín hiệu mà bạn không muốn xóa. Tôi không thích ý tưởng của việc có một tập tin tín hiệu so với kiểm tra một cách rõ ràng tem thời gian của mỗi tập tin trước khi nó bị xóa là 100% nhất định bạn không sao với việc mất nó. Tôi cũng không hoàn toàn hiểu cách tiếp cận của bạn đối phó với các thư mục con (không chắc chắn nếu đó là một yêu cầu cho OP, nhưng nó là dành cho tôi). – Dan

6

eJames: Tôi thấy giải pháp xcopy của bạn hoạt động rất tốt! Điều tôi thích nhất về nó là nó sẽ làm việc trong các phiên bản ngôn ngữ Windows khác hơn là tiếng Anh, vì định dạng của các tham số XCOPY có vẻ là thiết lập ngày độc lập. Tuyệt vời! ;]

Một cải tiến sẽ là tạo trước tệp FILES_TO_KEEP.TXT để nếu không có tệp nào phù hợp với tiêu chí lưu giữ, câu lệnh XCOPY thứ hai vẫn có thể tiếp tục và thực hiện việc xóa (không thành công nếu không tìm thấy FILES_TO_KEEP .TXT). Đây là kịch bản của tôi (xin lưu ý trong ví dụ này tôi đã thay đổi nó thành chỉ xóa các tệp * .pdf và tôi cũng thay đổi tên tệp tạm thời để đảm bảo không có xung đột tiềm ẩn, cũng như xóa sạch tệp tạm thời sau):

@echo off 
SET OLDERTHAN=%1 
IF NOT DEFINED OLDERTHAN GOTO SYNTAX 

echo >> ~~~FILES_TO_KEEP.TXT~ 
for /f "tokens=*" %%a IN ('xcopy *.pdf /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> ~~~FILES_TO_KEEP.TXT~ 
for /f "tokens=*" %%a IN ('xcopy *.pdf /L /I /EXCLUDE:~~~FILES_TO_KEEP.TXT~ null') do if exist "%%~nxa" del "%%~nxa" 
del ~~~FILES_TO_KEEP.TXT~ 

GOTO END 

:SYNTAX 
ECHO. 
ECHO USAGE: 
ECHO DELOLD mm-dd-yyyy 
ECHO Where mm-dd-yyyy is the date prior to which you want to delete files. 
ECHO. 
ECHO EX: "DELOLD 10-17-2008" Deletes files older than October 17, 2008. 
ECHO. 
ECHO This should work on any language version of Windows, but has only been 
ECHO tested in English-US versions. 
GOTO END 

:END 
8

Nếu bạn đang sử dụng Windows Server và/hoặc đã cài đặt Bộ tài nguyên máy chủ, forfiles có thể chính xác là những gì bạn đang tìm kiếm.

Ví dụ: in tất cả các tên tập tin, lớn hơn 180 ngày

forfiles /S /D -180 /C "cmd /C Echo @Path" >olderthan180days.txt 

xóa tất cả các file PDF, lớn hơn 365 ngày

forfiles /S /M *.pdf /D -365 /C "cmd /C Del @Path" 
+0

Giải pháp tuyệt vời, chính xác những gì tôi cần – LPChip

1

Có lẽ bạn sẽ như thế này: http://blog.jumlin.com/2010/10/move-files-in-folders-and-subfolders-older-than-one-year/

Đó là một tập lệnh sẽ di chuyển các tệp cũ hơn một năm, thậm chí nó hỗ trợ các định dạng ngày tháng và thư mục con khác nhau. Bạn có thể thực hiện một vài thay đổi để xóa nó thay vì di chuyển chúng. Đó là một kịch bản rất hoàn chỉnh với ý kiến ​​và giải thích.

+0

Trang web này hiện đang được bán ... – mdhansen

+0

Tôi đã cập nhật URL. – NiklasJ

Các vấn đề liên quan