Batch file để xóa các tập tin cũ hơn N ngày


677

Tôi đang tìm cách xóa tất cả các tệp cũ hơn 7 ngày trong một tệp bó. Tôi đã tìm kiếm trên web và tìm thấy một số ví dụ với hàng trăm dòng mã và những ví dụ khác yêu cầu cài đặt các tiện ích dòng lệnh bổ sung để hoàn thành nhiệm vụ.

Những điều tương tự có thể được thực hiện trong BASH chỉ trong một vài dòng mã. Có vẻ như một cái gì đó ít nhất là từ xa dễ dàng có thể được thực hiện cho các tệp bó trong Windows. Tôi đang tìm kiếm một giải pháp hoạt động trong dấu nhắc lệnh Windows tiêu chuẩn, không có bất kỳ tiện ích bổ sung nào. Xin vui lòng không có PowerShell hoặc Cygwin.


8
Jeff Atwood đã trả lời điều này trên Serverfault mà tôi nghĩ nên được ghi lại ở đây. serverfault.com/questions/49614/delete-files-older-than-x-days
Dusty

Một phương thức mới dựa trên tệp .BAT chỉ sử dụng các lệnh CMD.EXE nội bộ đã được đăng ở đây: stackoverflow.com/questions/9746778/
Lỗi

1
gehrcke.de/timegaps đã được thiết kế cho mục đích này. Nó thậm chí còn cho phép một sơ đồ xóa tinh vi hơn: ngoài việc giữ các tệp trong 7 ngày qua, ví dụ, nó cũng cho phép giữ một tệp cho mỗi 8 tuần, 12, tháng, 2 năm qua.
Tiến sĩ Jan-Philip Gehrcke

Câu trả lời:


1071

Thưởng thức:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

Xem forfilestài liệu để biết thêm chi tiết.

Để biết thêm thông tin, hãy tham khảo Chỉ số AZ của dòng lệnh Windows XP .

Nếu bạn chưa forfilescài đặt trên máy, hãy sao chép nó từ bất kỳ Windows Server 2003 nào sang máy Windows XP của bạn tại %WinDir%\system32\. Điều này là có thể vì EXE hoàn toàn tương thích giữa Windows Server 2003 và Windows XP.

Các phiên bản sau của Windows và Windows Server được cài đặt theo mặc định.

Đối với Windows 7 trở lên (bao gồm Windows 10):

Cú pháp đã thay đổi một chút. Do đó, lệnh được cập nhật là:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"

12
Nên là del @FILE, trường hợp quan trọng Ngoài ra tôi đề nghị sử dụng / c echo @FILE để thử nghiệm
Russell Steen

40
@Russell: @PATH là đường dẫn đầy đủ, bao gồm tên. @FILE chỉ là tên, vì vậy nếu bạn đang xử lý các thư mục con, nó sẽ không hoạt động.
gregmac

86
Lưu ý rằng nếu bạn muốn tập tin SAU hơn 10 ngày, bạn cần chỉ định -d "-10". -ve có nghĩa là "cũ hơn", + ve có nghĩa là "mới hơn". Bạn cũng có thể chỉ định định dạng DDMMYY hoặc -DDMMYY làm tham số cho -d.
gregmac

42
Tôi đã sử dụng cú pháp này trên Win Server 2008: forfiles / P "C: \ Mysql_backup" / S / M * .sql / D -30 / C "cmd / c del @PATH"
jman

9
Câu trả lời này hoạt động khi "cũ hơn 7 ngày" được định nghĩa là "được sửa đổi hơn 7 ngày trước" thay vì "được tạo ra hơn 7 ngày trước". Làm thế nào có thể đạt được sau này?
TimS

76

Chạy các lệnh sau :

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

Di chuyển tất cả các tệp (sử dụng / Mov, di chuyển các tệp và sau đó xóa chúng trái ngược với / di chuyển di chuyển toàn bộ filet sau đó bị xóa) thông qua robocopy đến một vị trí khác, và sau đó thực hiện lệnh xóa trên đường dẫn đó và bạn là tất cả tốt

Ngoài ra nếu bạn có một thư mục chứa nhiều dữ liệu, bạn có thể sử dụng /mirchuyển đổi


5
Đối với hầu hết các phần, đây là một câu trả lời khá không thực tế. Nếu tôi có một thư mục chứa nhiều dữ liệu trong đó, nó sẽ không hoạt động tốt. Tôi sẽ đi với một trong những câu trả lời là "tại chỗ"
adamb0mb

5
@ adamb0mb điều này là không thực tế - nếu "đích" nằm trên cùng hệ thống tệp với "nguồn" , thì thao tác di chuyển khá nhẹ. Vì robocopy thực sự mạnh mẽ, trên thực tế, nó sẽ hoạt động với mọi kích thước thư mục, tên tệp tối nghĩa, về cơ bản độ dài đường dẫn tùy ý và bao gồm các thư mục nếu bạn cần - một điều chắc chắn không thể nói về nhiều tiện ích Windows khác. Tôi sẽ sử dụng rd /s /q c:\destinationthay vì dellệnh mặc dù hoặc thậm chí sử dụng một lần robocopy /mir c:\emptydir c:\destinationchạy khác để làm trống thư mục nếu bạn gặp rắc rối với tên tệp.
syirecton-dj

12
Thêm vào đó, robocopy hỗ trợ các đường dẫn UNC - điều mà forfilestừ câu trả lời được chấp nhận sẽ không làm được.
syirecton-dj

3
Suy nghĩ của tôi đã đi sâu hơn: "Các tập tin của tôi đã ở nơi tôi muốn. Tôi không muốn phải di chuyển chúng." "Xóa các tệp là hợp lý những gì bạn đang làm, vì vậy hãy làm điều đó. Đừng quá tải Robocopy để làm điều đó"
adamb0mb

3
Tôi khuyên bạn nên sử dụng một lớp lót này để xem tất cả các tệp trong C:\testhơn 7 ngày. Để xóa các tệp, thay đổi echothành del:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
PowerUser

25

Ok đã chán một chút và nghĩ ra cái này, trong đó có phiên bản thay thế kỷ nguyên Linux của một người nghèo giới hạn cho việc sử dụng hàng ngày (không giữ thời gian):

7ngày.cmd

@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

SỬ DỤNG

set /a strip=day*7: Thay đổi 7 cho số ngày giữ.

set dSource=C:\temp : Đây là thư mục bắt đầu để kiểm tra các tập tin.

GHI CHÚ

Đây là mã không phá hủy, nó sẽ hiển thị những gì sẽ xảy ra.

Thay đổi :

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

đến một cái gì đó như:

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

vì vậy các tập tin thực sự bị xóa

Tháng 2 : được mã hóa cứng đến 28 ngày. Bissextile năm là một địa ngục để thêm, thực sự. nếu ai đó có ý tưởng sẽ không thêm 10 dòng mã, hãy tiếp tục và đăng để tôi thêm nó vào mã của mình.

epoch : Tôi không mất thời gian để xem xét, vì nhu cầu là xóa các tệp cũ hơn một ngày nhất định, mất hàng giờ / phút sẽ xóa các tệp khỏi một ngày có nghĩa là để giữ.

GIỚI HẠN

epoch được cấp định dạng ngày ngắn của bạn là YYYY-MM-DD. Nó sẽ cần được điều chỉnh cho các cài đặt khác hoặc đánh giá thời gian chạy (đọc sShortTime, cấu hình ràng buộc người dùng, định cấu hình thứ tự trường thích hợp trong bộ lọc và sử dụng bộ lọc để trích xuất dữ liệu chính xác từ đối số).

Tôi đã đề cập đến việc tôi ghét trình tự động của trình soạn thảo này chưa? nó loại bỏ các dòng trống và sao chép-dán là một địa ngục.

Tôi hi vọng cái này giúp được.


4
+1 cho mã không phá hủy, tôi sẽ cố gắng và ghi nhớ điều đó khi tôi tự cung cấp các ví dụ mã.
Haugholt

5
Muộn và hoàn toàn không liên quan, nhưng 7daysclean.cmdnghe có vẻ là một cái tên tuyệt vời cho ban nhạc Synth-Punk.
Flonk

21
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

Bạn nên làm /d -3(3 ngày trước) Điều này làm việc tốt cho tôi. Vì vậy, tất cả các lô phức tạp có thể nằm trong thùng rác. Cũng forfileskhông hỗ trợ các đường dẫn UNC, vì vậy hãy kết nối mạng với một ổ đĩa cụ thể.


3
Lỗi tương tự như trong các câu trả lời khác (bao gồm cả câu trả lời được chấp nhận). Thói quen kỳ lạ này chỉ *.*ra từ đâu? Wildcard *.*không khớp với tất cả các tệp trong Windows. Nó chỉ phù hợp với các tập tin với .tên của họ. OP không bao giờ nói bất cứ điều gì về yêu cầu .trong tên tệp. Tham số thích hợp là /M *, nhưng dù sao đây cũng là mặc định. Không cần thiết /Mgì cả.
AnT

@AnT: Bạn có chắc không? Tôi nghĩ rằng *.*hành xử chính xác như *trong Windows. Trong thực tế, tôi chỉ thử nó trên máy tính của tôi và dir *.*thực sự được liệt kê test file, một tệp không có phần mở rộng.
Andreas Rejbrand

1
@Andreas Rejbrand: Tôi cũng thấy ngạc nhiên, nhưng việc điều trị *.*không nhất quán giữa, nói dir-mlựa chọn forfiles. Các -m *.*mặt nạ thực sự sẽ bỏ tên tập tin extensionless, như tôi đã nói trong bình luận của tôi ở trên (thử nó cho mình). Phần buồn cười ở đây là tài liệu MS nêu rõ đó -m *.*là mặc định. Tuy nhiên, nếu bạn thử nó trong cuộc sống thực, bạn sẽ thấy rằng mặc định là thực sự -m *- tất cả các tệp được lặp lại.
AnT

1
Trang tài liệu MS này - technet.microsoft.com/en-us/l Library / cc753551 (v = ws.11) .aspx - chứa một số lượng lớn lỗi (ví dụ: vì ví dụ) tác giả của tài liệu tin rằng *.*mặt nạ được áp dụng cho tất cả các tập tin. Câu hỏi khó hiểu của tôi về "thói quen kỳ lạ này" thực sự chưa được đặt ra, vì việc đối xử *.**tương đương là một quy ước lâu dài của Windows. Tuy nhiên, /mtùy chọn trong trường forfileshợp vi phạm quy ước đó vì một số lý do.
AnT

1
Bối cảnh trên 5 ký tự đại diện trong Windows: blog.msdn.microsoft.com/jeremykuhne / 2017/04/04 / MS
MSalters

18

Hãy xem câu trả lời của tôi cho một câu hỏi tương tự :

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"

Điều này xóa các tập tin cũ hơn một ngày nhất định. Tôi chắc chắn rằng nó có thể được sửa đổi để quay trở lại bảy ngày kể từ ngày hiện tại.

cập nhật: Tôi nhận thấy rằng HerbCSO đã được cải thiện về kịch bản trên. Tôi khuyên bạn nên sử dụng phiên bản của mình để thay thế.


12

Lệnh của tôi là

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH - chỉ là đường dẫn trong trường hợp của tôi, vì vậy tôi phải sử dụng @PATH\@FILE

cũng forfiles /?không làm việc cho tôi, nhưng forfiles(không có "?") hoạt động tốt.

Và câu hỏi duy nhất tôi có: làm thế nào để thêm nhiều mặt nạ (ví dụ " .log | .bak")?

Tất cả điều này liên quan đến forfiles.exe mà tôi đã tải xuống ở đây (trên win XP)

Nhưng nếu bạn đang sử dụng máy chủ Windows thì forfiles.exe đã có sẵn và nó khác với phiên bản ftp. Đó là lý do tại sao tôi nên sửa đổi lệnh.

Đối với Windows Server 2003, tôi đang sử dụng lệnh này:

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"

9

Có rất nhiều câu hỏi liên quan đến ngày / thời gian liên quan để giải quyết với tệp bó. Nhưng trình thông dịch dòng lệnh cmd.exe không có chức năng tính toán ngày / giờ. Rất nhiều giải pháp hoạt động tốt sử dụng các ứng dụng hoặc tập lệnh điều khiển bổ sung đã được đăng ở đây, trên các trang khác của Stack Overflow và trên các trang web khác.

Phổ biến cho các hoạt động dựa trên ngày / giờ là yêu cầu chuyển đổi chuỗi ngày / giờ thành giây kể từ một ngày xác định. Rất phổ biến là 1970-01-01 00:00:00 UTC. Nhưng bất kỳ ngày nào sau đó cũng có thể được sử dụng tùy thuộc vào phạm vi ngày cần thiết để hỗ trợ cho một nhiệm vụ cụ thể.

Jay đã đăng 7daysclean.cmd chứa giải pháp "ngày đến giây" nhanh chóng cho trình thông dịch dòng lệnh cmd.exe . Nhưng nó không mất năm nhuận chính xác vào tài khoản. JR đã đăng một tiện ích bổ sung cho ngày nhuận trong năm hiện tại, nhưng bỏ qua các năm nhuận khác kể từ năm cơ sở, tức là kể từ năm 1970.

Tôi sử dụng từ 20 năm bảng tĩnh (mảng) được tạo một lần với hàm C nhỏ để nhanh chóng nhận được số ngày, kể cả ngày nhuận từ 1970-01-01 trong các hàm chuyển đổi ngày / giờ trong các ứng dụng của tôi được viết bằng C / C ++.

Phương pháp bảng rất nhanh này cũng có thể được sử dụng trong mã hàng loạt bằng lệnh FOR . Vì vậy, tôi quyết định mã hóa chương trình con hàng loạt GetSecondstính toán số giây kể từ 1970-01-01 00:00:00 UTC cho chuỗi ngày / thời gian được truyền cho thói quen này.

Lưu ý: Không tính đến giây nhuận vì các hệ thống tệp Windows cũng không hỗ trợ giây nhuận.

Đầu tiên, các bảng:

  1. Ngày kể từ 1970-01-01 00:00:00 UTC cho mỗi năm bao gồm cả ngày nhuận.

    1970 - 1979:     0   365   730  1096  1461  1826  2191  2557  2922  3287
    1980 - 1989:  3652  4018  4383  4748  5113  5479  5844  6209  6574  6940
    1990 - 1999:  7305  7670  8035  8401  8766  9131  9496  9862 10227 10592
    2000 - 2009: 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245
    2010 - 2019: 14610 14975 15340 15706 16071 16436 16801 17167 17532 17897
    2020 - 2029: 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550
    2030 - 2039: 21915 22280 22645 23011 23376 23741 24106 24472 24837 25202
    2040 - 2049: 25567 25933 26298 26663 27028 27394 27759 28124 28489 28855
    2050 - 2059: 29220 29585 29950 30316 30681 31046 31411 31777 32142 32507
    2060 - 2069: 32872 33238 33603 33968 34333 34699 35064 35429 35794 36160
    2070 - 2079: 36525 36890 37255 37621 37986 38351 38716 39082 39447 39812
    2080 - 2089: 40177 40543 40908 41273 41638 42004 42369 42734 43099 43465
    2090 - 2099: 43830 44195 44560 44926 45291 45656 46021 46387 46752 47117
    2100 - 2106: 47482 47847 48212 48577 48942 49308 49673
    

    Việc tính các giây cho năm 2039 đến 2106 với epoch bắt đầu 1970-01-01 chỉ có thể bằng cách sử dụng biến 32 bit không dấu, tức là dài không dấu (hoặc int unsign) trong C / C ++.

    Nhưng cmd.exe sử dụng cho các biểu thức toán học một biến 32 bit đã ký. Do đó, giá trị tối đa là 2147483647 (0x7FFFFFFF) là 2038-01-19 03:14:07.

  2. Thông tin năm nhuận (Không / Có) trong các năm 1970 đến 2106.

    1970 - 1989: N N Y N N N Y N N N Y N N N Y N N N Y N
    1990 - 2009: N N Y N N N Y N N N Y N N N Y N N N Y N
    2010 - 2029: N N Y N N N Y N N N Y N N N Y N N N Y N
    2030 - 2049: N N Y N N N Y N N N Y N N N Y N N N Y N
    2050 - 2069: N N Y N N N Y N N N Y N N N Y N N N Y N
    2070 - 2089: N N Y N N N Y N N N Y N N N Y N N N Y N
    2090 - 2106: N N Y N N N Y N N N N N N N Y N N
                                     ^ year 2100
    
  3. Số ngày đến ngày đầu tiên của mỗi tháng trong năm hiện tại.

                       Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    Year with 365 days:  0  31  59  90 120 151 181 212 243 273 304 334
    Year with 366 days:  0  31  60  91 121 152 182 213 244 274 305 335
    

Chuyển đổi một ngày thành số giây kể từ 1970-01-01 khá dễ dàng bằng cách sử dụng các bảng đó.

Xin chú ý!

Định dạng của chuỗi ngày và giờ phụ thuộc vào cài đặt ngôn ngữ và khu vực của Windows. Delimiters và thứ tự của thẻ gán cho các biến môi trường Day, MonthYeartrong lần đầu tiên CHO vòng lặp của GetSecondsphải được điều chỉnh để định dạng ngày / giờ địa phương nếu cần thiết.

Cần điều chỉnh chuỗi ngày của biến môi trường nếu định dạng ngày trong biến môi trường DATE khác với định dạng ngày được sử dụng bởi lệnh FOR on %%~tF.

Ví dụ: khi %DATE%mở rộng sang Sun 02/08/2015trong khi %%~tFmở rộng 02/08/2015 07:38 PMmã bên dưới có thể được sử dụng với sửa đổi dòng 4 thành:

call :GetSeconds "%DATE:~4% %TIME%"

Điều này dẫn đến việc chuyển sang chương trình con chỉ 02/08/2015- chuỗi ngày không có 3 chữ cái viết tắt của ngày trong tuần và ký tự khoảng trắng phân cách.

Cách khác có thể được sử dụng để vượt qua ngày hiện tại ở định dạng chính xác:

call :GetSeconds "%DATE:~-10% %TIME%"

Bây giờ 10 ký tự cuối cùng từ chuỗi ngày được truyền vào hàm GetSecondsvà do đó, không có vấn đề gì nếu chuỗi ngày của biến môi trường DATE có hoặc không có ngày trong tuần miễn là ngày và tháng luôn có 2 chữ số theo thứ tự dự kiến, nghĩa là theo định dạng dd/mm/yyyy hoặc dd.mm.yyyy.

Dưới đây là mã bó với giải thích các bình luận chỉ xuất ra tệp nào cần xóa và tệp nào sẽ giữ trong C:\Tempcây thư mục, xem mã của vòng lặp FOR đầu tiên .

@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Get seconds since 1970-01-01 for current date and time.
call :GetSeconds "%DATE% %TIME%"
rem Subtract seconds for 7 days from seconds value.
set /A "LastWeek=Seconds-7*86400"

rem For each file in each subdirectory of C:\Temp get last modification date
rem (without seconds -> append second 0) and determine the number of seconds
rem since 1970-01-01 for this date/time. The file can be deleted if seconds
rem value is lower than the value calculated above.

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    rem if !Seconds! LSS %LastWeek% del /F "%%~fF"
    if !Seconds! LEQ %LastWeek% (
        echo Delete "%%~fF"
    ) else (
        echo Keep   "%%~fF"
    )
)
endlocal
goto :EOF


rem No validation is made for best performance. So make sure that date
rem and hour in string is in a format supported by the code below like
rem MM/DD/YYYY hh:mm:ss or M/D/YYYY h:m:s for English US date/time.

:GetSeconds

rem If there is " AM" or " PM" in time string because of using 12 hour
rem time format, remove those 2 strings and in case of " PM" remember
rem that 12 hours must be added to the hour depending on hour value.

set "DateTime=%~1"
set "Add12Hours=0"
if "%DateTime: AM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: AM=%"
) else if "%DateTime: PM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: PM=%"
    set "Add12Hours=1"
)

rem Get year, month, day, hour, minute and second from first parameter.

for /F "tokens=1-6 delims=,-./: " %%A in ("%DateTime%") do (
    rem For English US date MM/DD/YYYY or M/D/YYYY
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    rem For German date DD.MM.YYYY or English UK date DD/MM/YYYY
    rem set "Day=%%A" & set "Month=%%B" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
rem echo Date/time is: %Year%-%Month%-%Day% %Hour%:%Minute%:%Second%

rem Remove leading zeros from the date/time values or calculation could be wrong.
if "%Month:~0,1%"  EQU "0" ( if "%Month:~1%"  NEQ "" set "Month=%Month:~1%"   )
if "%Day:~0,1%"    EQU "0" ( if "%Day:~1%"    NEQ "" set "Day=%Day:~1%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )

rem Add 12 hours for time range 01:00:00 PM to 11:59:59 PM,
rem but keep the hour as is for 12:00:00 PM to 12:59:59 PM.
if "%Add12Hours%" == "1" (
    if %Hour% LSS 12 set /A Hour+=12
)
set "DateTime="
set "Add12Hours="

rem Must use 2 arrays as more than 31 tokens are not supported
rem by command line interpreter cmd.exe respectively command FOR.
set /A "Index1=Year-1979"
set /A "Index2=Index1-30"

if %Index1% LEQ 30 (
    rem Get number of days to year for the years 1980 to 2009.
    for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y"
    for /F "tokens=%Index1% delims= " %%L in ("Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N") do set "LeapYear=%%L"
) else (
    rem Get number of days to year for the years 2010 to 2038.
    for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y"
    for /F "tokens=%Index2% delims= " %%L in ("N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N") do set "LeapYear=%%L"
)

rem Add the days to month in year.
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)

rem Add the complete days in month of year.
set /A "Days+=Day-1"

rem Calculate the seconds which is easy now.
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"

rem Exit this subroutine
goto :EOF

Để có hiệu suất tối ưu, tốt nhất là xóa tất cả các nhận xét, tức là tất cả các dòng bắt đầu bằng rem sau 0-4 khoảng trắng hàng đầu.

Và các mảng có thể được thực hiện cũng nhỏ hơn, tức là giảm phạm vi thời gian từ 1980-01-01 00:00:00 đến 2038-01-19 03:14:07 như được hỗ trợ bởi mã lô ở trên, ví dụ như 2015-01 -01 đến 2019-12-31 như mã dưới đây sử dụng để thực sự xóa các tệp cũ hơn 7 ngày trong C:\Tempcây thư mục.

Hơn nữa mã lô dưới đây được tối ưu hóa cho định dạng thời gian 24 giờ.

@echo off
setlocal EnableDelayedExpansion
call :GetSeconds "%DATE:~-10% %TIME%"
set /A "LastWeek=Seconds-7*86400"

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    if !Seconds! LSS %LastWeek% del /F "%%~fF"
)
endlocal
goto :EOF

:GetSeconds
for /F "tokens=1-6 delims=,-./: " %%A in ("%~1") do (
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
if "%Month:~0,1%"  EQU "0" ( if "%Month:~1%"  NEQ "" set "Month=%Month:~1%"   )
if "%Day:~0,1%"    EQU "0" ( if "%Day:~1%"    NEQ "" set "Day=%Day:~1%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )
set /A "Index=Year-2014"
for /F "tokens=%Index% delims= " %%Y in ("16436 16801 17167 17532 17897") do set "Days=%%Y"
for /F "tokens=%Index% delims= " %%L in ("N Y N N N") do set "LeapYear=%%L"
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)
set /A "Days+=Day-1"
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"
goto :EOF

Để biết thêm thông tin về định dạng ngày và thời gian và so sánh thời gian tệp trên Windows, hãy xem câu trả lời của tôi trên Tìm hiểu xem tệp có cũ hơn 4 giờ trong tệp bó với nhiều thông tin bổ sung về thời gian tệp hay không.


9

Sao chép mã này và lưu nó dưới dạng DelOldFiles.vbs.

SỬ DỤNG TRONG CMD: cscript //nologo DelOldFiles.vbs 15

15 có nghĩa là xóa các tập tin cũ hơn 15 ngày trong quá khứ.

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified<ThresholdDate Then
        Wscript.StdOut.WriteLine f1
        f1.Delete
        n = n + 1    
     End If
       Next
       Wscript.StdOut.WriteLine "Deleted " & n & " file(s)."
    End Function

    If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past."
      WScript.Quit 0   
    End If

    DeleteOlderFiles(".")
 'to here

8

Đối với Windows Server 2008 R2:

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

Điều này sẽ xóa tất cả các tệp .sql cũ hơn 90 ngày.


7

Sử dụng forfiles.

Có nhiều phiên bản khác nhau. Những người đầu sử dụng tham số phong cách unix.

Phiên bản của tôi (cho máy chủ 2000 - lưu ý không có chỗ trống sau khi chuyển đổi) -

forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path"

Để thêm forfiles vào XP, hãy lấy exe từ ftp://ftp.microsoft.com/ResKit/y2kfix/x86/

và thêm nó vào C: \ WINDOWS \ system32


11
@Kibbee không phải là cùng một câu trả lời cú pháp là khác nhau. Đây là một nỗ lực geniune để giúp đỡ. Được biết rất ít dòng lệnh windows, tôi đã dành hàng giờ thất vọng để làm việc này. Các thông tin chính đối với tôi là thực tế là có các phiên bản khác nhau (với cú pháp khác nhau) và tôi cần phải xóa các khoảng trắng. Cả hai điều này đều không có trong câu trả lời ban đầu. (Tôi đã nhận xét về câu trả lời nhưng tôi không có đặc quyền
Aidan Ewen

Lỗi tương tự như trong các câu trả lời khác (bao gồm cả câu trả lời được chấp nhận). Wildcard *.*trong forfileskhông phù hợp với tất cả các tập tin. Nó chỉ khớp với các tệp có .tên của chúng (tức là các tệp có phần mở rộng). OP không bao giờ nói bất cứ điều gì về yêu cầu .trong tên tệp. Tham số thích hợp là /M *, nhưng dù sao đây cũng là mặc định. Không cần thiết /Mgì cả.
AnT

7

Đối với windows 2012 R2, phần sau sẽ hoạt động:

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c del @path"

để xem các tập tin sẽ bị xóa sử dụng này

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate"

Điều này thậm chí hoạt động trong Windows Server 2008 trở lên và Windows 7.
kwrl

6

IMO, JavaScript đang dần trở thành một tiêu chuẩn kịch bản phổ quát: nó có thể có sẵn trong nhiều sản phẩm hơn bất kỳ ngôn ngữ kịch bản lệnh nào khác (trong Windows, nó có sẵn bằng Windows Scripting Host). Tôi phải dọn sạch các tệp cũ trong nhiều thư mục, vì vậy đây là hàm JavaScript để làm điều đó:

// 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);
    }
}

Đối với mỗi thư mục để xóa, chỉ cần thêm một cuộc gọi khác vào hàm clearFolder (). Mã đặc biệt này cũng bảo tồn các tệp exe và dll và cũng dọn sạch các thư mục con.


6

Làm thế nào về sửa đổi này vào 7daysclean.cmd để có một năm nhuận vào tài khoản?

Nó có thể được thực hiện trong ít hơn 10 dòng mã hóa!

set /a Leap=0
if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
set /a Months=!_months!+Leap

Chỉnh sửa bởi Mofi:

Điều kiện trên do JR đóng góp đánh giá luôn sai vì cú pháp không hợp lệ.

Month GEQ 2cũng sai vì thêm 86400 giây cho một ngày nữa phải được thực hiện trong một năm nhuận chỉ trong các tháng từ tháng ba đến tháng mười hai, nhưng không phải cho tháng hai.

Một mã làm việc để đưa ngày nhuận vào tài khoản - chỉ trong năm hiện tại - trong tệp bó 7 ngàyclean.cmd được đăng bởi Jay sẽ là:

set "LeapDaySecs=0"
if %Month% LEQ 2 goto CalcMonths
set /a "LeapRule=Years%%4"
if %LeapRule% NEQ 0 goto CalcMonths
rem The other 2 rules can be ignored up to year 2100.
set /A "LeapDaySecs=day"
:CalcMonths
set /a Months=!_months!+LeapDaySecs

5

Tôi có thể thêm một đóng góp khiêm tốn cho chủ đề đã có giá trị này. Tôi thấy rằng các giải pháp khác có thể thoát khỏi văn bản lỗi thực tế nhưng đang bỏ qua% ERRORLEVEL% báo hiệu lỗi trong ứng dụng của tôi. VÀ tôi hợp pháp muốn% ERRORLEVEL% miễn là đó không phải là lỗi "Không tìm thấy tệp".

Vài ví dụ:

Gỡ lỗi và loại bỏ lỗi cụ thể:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success

Sử dụng một oneliner để trả về thành công hay thất bại ERRORLEVEL:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0

Sử dụng một oneliner để giữ cho ERRORLEVEL ở mức 0 để thành công trong bối cảnh của một lô ở giữa mã khác (ver> nul đặt lại ERRORLEVEL):

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul

Đối với một công việc SQL Server Agent CmdExec, tôi đã tìm đến phần sau. Tôi không biết đó có phải là lỗi không, nhưng CmdExec trong bước chỉ nhận ra dòng mã đầu tiên:

cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%

5

Trời ạ, rất nhiều câu trả lời rồi. Một lộ trình đơn giản và thuận tiện mà tôi tìm thấy là thực thi ROBOCOPY.EXE hai lần theo thứ tự liên tiếp từ một lệnh dòng lệnh Windows duy nhất bằng cách sử dụng tham số & .

ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 & ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 /PURGE

Trong ví dụ này, nó hoạt động bằng cách chọn tất cả các tệp ( . ) Cũ hơn 30 ngày và di chuyển chúng vào thư mục đích. Lệnh thứ hai thực hiện lại một lần nữa với việc bổ sung lệnh PURGE có nghĩa là loại bỏ các tệp trong thư mục đích không tồn tại trong thư mục nguồn. Vì vậy, về cơ bản, lệnh đầu tiên tập tin MOVES và DELETES thứ hai vì chúng không còn tồn tại trong thư mục nguồn khi lệnh thứ hai được gọi.

Tham khảo tài liệu của ROBOCOPY và sử dụng công tắc / L khi kiểm tra.


4

Nếu bạn có bộ tài nguyên XP, bạn có thể sử dụng robocopy để di chuyển tất cả các thư mục cũ vào một thư mục, sau đó sử dụng rmdir để xóa chỉ một thư mục đó:

mkdir c:\temp\OldDirectoriesGoHere
robocopy c:\logs\SoManyDirectoriesToDelete\ c:\temp\OldDirectoriesGoHere\ /move /minage:7
rmdir /s /q c:\temp\OldDirectoriesGoHere

4

Tôi nghĩ rằng câu trả lời của e.James là tốt vì nó hoạt động với các phiên bản Windows chưa được sửa đổi sớm nhất là Windows 2000 SP4 (và có thể sớm hơn), nhưng nó yêu cầu ghi vào tệp bên ngoài. Đây là phiên bản sửa đổi không tạo tệp văn bản bên ngoài trong khi vẫn duy trì tính tương thích:

REM del_old.cmd
REM usage: del_old MM-DD-YYYY
setlocal enabledelayedexpansion
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;"
for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1)

Để đúng với câu hỏi ban đầu, đây là một kịch bản TẤT CẢ toán học cho bạn nếu bạn gọi nó với số ngày là tham số:

REM del_old_compute.cmd
REM usage: del_old_compute N
setlocal enabledelayedexpansion
set /a days=%1&set cur_y=%DATE:~10,4%&set cur_m=%DATE:~4,2%&set cur_d=%DATE:~7,2%
for /f "tokens=1 delims==" %%a in ('set cur_') do if "!%%a:~0,1!"=="0" set /a %%a=!%%a:~1,1!+0
set mo_2=28&set /a leapyear=cur_y*10/4
if %leapyear:~-1% equ 0 set mo_2=29
set mo_1=31&set mo_3=31&set mo_4=30&set mo_5=31
set mo_6=30&set mo_7=31&set mo_8=31&set mo_9=30
set mo_10=31&set mo_11=30&set mo_12=31
set /a past_y=(days/365)
set /a monthdays=days-((past_y*365)+((past_y/4)*1))&&set /a past_y=cur_y-past_y&set months=0
:setmonth
set /a minusmonth=(cur_m-1)-months
if %minusmonth% leq 0 set /a minusmonth+=12
set /a checkdays=(mo_%minusmonth%)
if %monthdays% geq %checkdays% set /a months+=1&set /a monthdays-=checkdays&goto :setmonth
set /a past_m=cur_m-months
set /a lastmonth=cur_m-1
if %lastmonth% leq 0 set /a lastmonth+=12
set /a lastmonth=mo_%lastmonth%
set /a past_d=cur_d-monthdays&set adddays=::
if %past_d% leq 0 (set /a past_m-=1&set adddays=)
if %past_m% leq 0 (set /a past_m+=12&set /a past_y-=1)
set mo_2=28&set /a leapyear=past_y*10/4
if %leapyear:~-1% equ 0 set mo_2=29
%adddays%set /a past_d+=mo_%past_m%
set d=%past_m%-%past_d%-%past_y%
for /f "tokens=*" %%a IN ('xcopy *.* /d:%d% /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;"
for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1)

LƯU Ý: Mã ở trên tính đến năm nhuận, cũng như số ngày chính xác trong mỗi tháng. Tối đa duy nhất là tổng số ngày đã có kể từ 0/0/0 (sau đó nó trả về năm âm).

LƯU Ý: Toán học chỉ đi một chiều; nó không thể có được ngày chính xác trong tương lai từ đầu vào tiêu cực (nó sẽ thử, nhưng có thể sẽ đi qua ngày cuối cùng của tháng).


3

Bạn có thể có thể kéo cái này ra. Bạn có thể xem câu hỏi này , cho một ví dụ đơn giản hơn. Sự phức tạp đến, khi bạn bắt đầu so sánh ngày. Có thể dễ dàng để biết ngày có lớn hơn hay không, nhưng có nhiều tình huống để xem xét nếu bạn cần thực sự có được sự khác biệt giữa hai ngày.

Nói cách khác - đừng cố phát minh ra điều này, trừ khi bạn thực sự không thể sử dụng các công cụ của bên thứ ba.


3

Điều này không có gì đáng kinh ngạc, nhưng tôi cần phải làm một cái gì đó như thế này hôm nay và chạy nó như một nhiệm vụ theo lịch trình, v.v.

tệp bó, DelFilesOlderThanNDays.bat bên dưới với mẫu exec w / params:

DelFilesOlderThanNDays.bat 7 C: \ dir1 \ dir2 \ dir3 \ log * .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

3

Mở rộng câu trả lời của aku, tôi thấy rất nhiều người hỏi về con đường của UNC. Chỉ cần ánh xạ đường dẫn tới một ký tự ổ đĩa sẽ làm cho các forfiles hạnh phúc. Ánh xạ và hủy ánh xạ của các ổ đĩa có thể được thực hiện theo chương trình trong một tệp bó, chẳng hạn.

net use Z: /delete
net use Z: \\unc\path\to\my\folder
forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"

Thao tác này sẽ xóa tất cả các tệp có phần mở rộng .gz cũ hơn 7 ngày. Nếu bạn muốn đảm bảo Z: không được ánh xạ tới bất kỳ thứ gì khác trước khi sử dụng, bạn có thể làm một việc đơn giản như

net use Z: \\unc\path\to\my\folder
if %errorlevel% equ 0 (
    forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"
) else (
    echo "Z: is already in use, please use another drive letter!"
)

3

ROBOCOPY hoạt động tuyệt vời cho tôi. Ban đầu đề nghị Iman của tôi. Nhưng thay vì di chuyển các tập tin / thư mục vào một thư mục tạm thời sau đó xóa nội dung của thư mục tạm thời, hãy di chuyển các tập tin vào thùng rác !!!

Đây là một vài dòng của tệp bó sao lưu của tôi, ví dụ:

SET FilesToClean1=C:\Users\pauls12\Temp
SET FilesToClean2=C:\Users\pauls12\Desktop\1616 - Champlain\Engineering\CAD\Backups

SET RecycleBin=C:\$Recycle.Bin\S-1-5-21-1480896384-1411656790-2242726676-748474

robocopy "%FilesToClean1%" "%RecycleBin%" /mov /MINLAD:15 /XA:SH /NC /NDL /NJH /NS /NP /NJS
robocopy "%FilesToClean2%" "%RecycleBin%" /mov /MINLAD:30 /XA:SH /NC /NDL /NJH /NS /NP /NJS

Nó xóa mọi thứ cũ hơn 15 ngày trong thư mục 'Temp' của tôi và 30 ngày cho mọi thứ trong thư mục sao lưu AutoCAD của tôi. Tôi sử dụng các biến vì dòng có thể khá dài và tôi có thể sử dụng lại chúng cho các vị trí khác. Bạn chỉ cần tìm đường dẫn dos đến thùng rác được liên kết với thông tin đăng nhập của bạn.

Đây là trên một máy tính làm việc cho tôi và nó hoạt động. Tôi hiểu rằng một số bạn có thể có nhiều quyền hạn chế hơn nhưng dù sao cũng nên thử;) Tìm kiếm Google để giải thích về các tham số ROBOCOPY.

Chúc mừng!


1
Câu trả lời được đánh giá cao thứ hai hiện tại cũng tán thành RoboCopy. Cấp, bạn sử dụng một số tùy chọn khác nhau, nhưng nó gần với câu trả lời hiện có.
Jonathan Leffler

2
Bài đăng này có nội dung mới - di chuyển tệp vào thùng rác. Điều này vẫn chưa được đề xuất với Robocopy và nó trả lời đầy đủ bài đăng gốc bằng cách sử dụng lệnh đơn dòng tích hợp. Hoạt động tốt hơn so với việc kết hợp các lệnh 'DEL' và 'RMDIR' vì các tệp có thể được khôi phục từ thùng rác. Này, tôi vẫn còn mới ở đây - hãy cho tôi nghỉ ngơi;)
Shawn Pauliszyn

2

Tập lệnh của tôi để xóa các tập tin cũ hơn một năm cụ thể:

@REM _______ GENERATE A CMD TO DELETE FILES OLDER THAN A GIVEN YEAR
@REM _______ (given in _olderthanyear variable)
@REM _______ (you must LOCALIZE the script depending on the dir cmd console output)
@REM _______ (we assume here the following line's format "11/06/2017  15:04            58 389 SpeechToText.zip")

@set _targetdir=c:\temp
@set _olderthanyear=2017

@set _outfile1="%temp%\deleteoldfiles.1.tmp.txt"
@set _outfile2="%temp%\deleteoldfiles.2.tmp.txt"

  @if not exist "%_targetdir%" (call :process_error 1 DIR_NOT_FOUND "%_targetdir%") & (goto :end)

:main
  @dir /a-d-h-s /s /b %_targetdir%\*>%_outfile1%
  @for /F "tokens=*" %%F in ('type %_outfile1%') do @call :process_file_path "%%F" %_outfile2%
  @goto :end

:end
  @rem ___ cleanup and exit
  @if exist %_outfile1% del %_outfile1%
  @if exist %_outfile2% del %_outfile2%
  @goto :eof

:process_file_path %1 %2
  @rem ___ get date info of the %1 file path
  @dir %1 | find "/" | find ":" > %2
  @for /F "tokens=*" %%L in ('type %2') do @call :process_line "%%L" %1
  @goto :eof

:process_line %1 %2
  @rem ___ generate a del command for each file older than %_olderthanyear%
  @set _var=%1
  @rem  LOCALIZE HERE (char-offset,string-length)
  @set _fileyear=%_var:~0,4%
  @set _fileyear=%_var:~7,4%
  @set _filepath=%2
  @if %_fileyear% LSS %_olderthanyear% echo @REM %_fileyear%
  @if %_fileyear% LSS %_olderthanyear% echo @del %_filepath%
  @goto :eof

:process_error %1 %2
  @echo RC=%1 MSG=%2 %3
  @goto :eof

1

Điều này đã làm điều đó cho tôi. Nó hoạt động với một ngày và bạn có thể trừ đi số tiền mong muốn trong nhiều năm để quay ngược thời gian:

@echo off

set m=%date:~-7,2%
set /A m
set dateYear=%date:~-4,4%
set /A dateYear -= 2
set DATE_DIR=%date:~-10,2%.%m%.%dateYear% 

forfiles /p "C:\your\path\here\" /s /m *.* /d -%DATE_DIR% /c "cmd /c del @path /F"

pause

các /Ftrong cmd /c del @path /Flực lượng tập tin cụ thể sẽ được xóa trong một số trường hợp các tập tin có thể được read-only.

các dateYear là năm Biến và ở đó bạn có thể thay đổi phần phụ theo nhu cầu của riêng bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.