N günden eski dosyaları silmek için toplu iş dosyası


678

Bir toplu iş dosyasında 7 günden eski tüm dosyaları silmek için bir yol arıyorum. Web'de arama yaptım ve yüzlerce kod satırı ile bazı örnekler buldum ve diğerleri, görevi gerçekleştirmek için ekstra komut satırı yardımcı programları yüklemeyi gerektirdi.

Benzer şeyler BASH'de sadece birkaç satır satırda yapılabilir . Windows'daki toplu dosyalar için en azından uzaktan kolay bir şey yapılabilir. Herhangi bir ekstra yardımcı program olmadan, standart bir Windows komut isteminde çalışan bir çözüm arıyorum. Lütfen PowerShell veya Cygwin de yok.


8
Jeff Atwood, burada belgelenmesi gerektiğini düşündüğüm Serverfault üzerinde cevap verdi. serverfault.com/questions/49614/delete-files-older-than-x-days
Dusty

Yalnızca dahili CMD.EXE komutlarını kullanan bir .BAT dosyasına dayalı yeni bir yöntem burada yayınlanmıştır: stackoverflow.com/questions/9746778/…
Aacini

1
gehrcke.de/timegaps bu amaç için tasarlanmıştır. Daha karmaşık bir silme şemasına bile izin verir: son 7 günün dosyalarını tutmanın yanı sıra, örneğin son 8 hafta, 12, ay, 2 yılın her biri için bir dosya tutmaya da izin verir.
Dr.Jan-Philip Gehrcke

Yanıtlar:


1071

Zevk almak:

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

Daha fazla ayrıntı için forfilesbelgelere bakın.

Daha fazla özellik için, Windows XP komut satırının AZ Dizini'ne bakın .

Eğer var yoksa forfilesmakinenizde yüklü herhangi birinden kopyalamak , Windows Server 2003 de Windows XP makineye %WinDir%\system32\. EXE, Windows Server 2003 ve Windows XP arasında tamamen uyumlu olduğundan bu mümkündür.

Windows ve Windows Server'ın sonraki sürümlerinde varsayılan olarak yüklüdür.

Windows 7 ve daha yenisi için (Windows 10 dahil):

Sözdizimi biraz değişti. Bu nedenle, güncellenmiş komut:

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

12
Del @FILE olmalı, dava önemlidir Ayrıca test için / c echo @FILE kullanmanızı öneririm
Russell Steen

40
@Russell: @PATH ad da dahil olmak üzere tam yoldur. @Dosya sadece isimdir, bu nedenle alt klasörlerle uğraşıyorsanız işe yaramaz.
Mart'ta gregmac

86
10 günden daha eski dosyalar istiyorsanız, -d "-10" belirtmeniz gerektiğini unutmayın. -ve "daha eski" anlamına gelir, + ve "daha yeni" anlamına gelir. Ayrıca -d parametresi olarak DDMMYY veya -DDMMYY biçimini de belirleyebilirsiniz.
Mart'ta gregmac

42
Win Server 2008'de bu sözdizimini kullandım: forfiles / P "C: \ Mysql_backup" / S / M * .sql / D -30 / C "cmd / c del @PATH"
jman

9
Bu yanıt, "7 günden daha önce oluşturuldu" yerine "7 günden daha eski" olarak tanımlandığında çalışır. İkincisi nasıl başarılabilir?
TimS

76

Aşağıdaki komutları çalıştırın :

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

Tüm dosyaları (/ mov kullanarak, dosyaları taşır ve daha sonra silinecek tüm dosya türlerini hareket ettiren / taşı yerine siler) robocopy ile başka bir konuma taşıyın ve sonra bu yolda bir delete komutu yürütün ve iyi.

Ayrıca içinde çok fazla veri bulunan bir dizininiz varsa /mirswitch'i kullanabilirsiniz.


5
Çoğunlukla, bu oldukça pratik olmayan bir cevaptır. İçinde çok fazla veri bulunan bir dizin varsa, iyi çalışmaz. Ben "yerinde" yapan bir cevap ile gitmek istiyorum
adamb0mb

5
@ adamb0mb bu hiçbir şekilde pratik değildir - "hedef" , "kaynak" ile aynı dosya sisteminde ise , taşıma işlemi oldukça hafiftir. Robocopy gerçekten sağlam olduğundan, aslında herhangi bir dizin boyutu, belirsiz dosya adları, temelde keyfi yol uzunlukları için çalışacak ve ihtiyacınız varsa dizinleri içerecektir - diğer birçok Windows yardımcı programı hakkında kesinlikle söylenemeyen bir şey. Ben komut rd /s /q c:\destinationyerine delolsa kullanmak veya hatta robocopy /mir c:\emptydir c:\destinationdosya adları ile sorun bekliyoruz dizini boşaltmak için başka bir çalışma kullanın.
syneticon-dj

12
Ayrıca, robokopi forfiles, kabul edilen yanıttan gelmeyecek olan UNC yollarını destekliyor .
syneticon-dj

3
Düşüncelerim daha çok satırdaydı: "Dosyalarım zaten onları istediğim yerde. Taşımak istemiyorum." "Dosyaları silmek mantıklı bir şekilde yaptığınız şeydir, bunu yapın. Bunu yapmak için Robocopy'yi aşırı yüklemeyin"
adamb0mb

3
Bu tek astarı C:\test7 günden eski tüm dosyaları görüntülemek için tavsiye ederim . Dosyaları silmek için şu echoşekilde değiştirin del:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
PowerUser

25

Tamam biraz sıkıldı ve günlük kullanım için sınırlı bir yoksul adamın Linux dönem değiştirme benim sürümü içeren (zaman tutma) bu ile geldi:

7daysclean.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

KULLANIM

set /a strip=day*7: Saklanacak gün sayısı için 7 değerini değiştirin .

set dSource=C:\temp : Bu, dosyaları kontrol etmek için başlangıç ​​dizinidir.

NOTLAR

Bu tahribatsız koddur, ne olacağını gösterecektir.

Değişiklik :

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

gibi bir şeye:

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

böylece dosyalar gerçekten silinir

Şubat : 28 güne kadar kodlanmıştır. Bissextile yılları gerçekten eklemek çok cehennem. Birisi 10 satır kod eklemeyecek bir fikriniz varsa, devam edin ve koduma eklemek için gönderin.

epoch : Belirli bir tarihten daha eski dosyaları silmeye ihtiyaç duyduğum için zaman ayırmadım, saat / dakika almak dosyaları saklamak için tasarlanmış bir günden silebilirdi.

SINIRLAMA

epoch kısa tarih formatınız YYYY-AA-GG olarak kabul edilir. Diğer ayarlar veya çalışma zamanı değerlendirmesi için uyarlanması gerekir (sShortTime'ı okuyun, kullanıcıya bağlı yapılandırma, bir filtrede uygun alan sırasını yapılandırın ve bağımsız değişkenten doğru verileri ayıklamak için filtreyi kullanın).

Bu editörün otomatik biçimlendirmesinden nefret ettiğimi söylemiş miydim? boş satırları kaldırır ve kopyala yapıştır bir cehennemdir.

Umarım bu yardımcı olur.


4
Tahribatsız kod için +1, kendimi kod örnekleri sağladığımda bunu akılda tutmaya çalışacağım.
Haugholt

5
Geç ve tamamen ilgisiz, ancak 7daysclean.cmdSynth-Punk grubu için harika bir isim gibi geliyor.
Flonk

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

Yapmalısın /d -3(3 gün önce) Bu benim için iyi çalışıyor. Böylece tüm karmaşık partiler çöp kutusunda olabilir. Ayrıca forfiles, UNC yolları desteklemediğini kalmamak belirli bir tahrik için bir ağ bağlantısı yapmak.


3
Diğer cevaplardaki hata (kabul edilen cevap dahil). Bu garip belirleme alışkanlığı *.*nereden geldi? Joker karakter *.*, Windows'daki tüm dosyalarla eşleşmiyor. Yalnızca .adlarında bulunan dosyalarla eşleşir . OP ., dosya adının istenmesi hakkında hiçbir şey söylemedi . Doğru parametre /M *, ancak bu zaten varsayılan değerdir. Hiç gerek yok /M.
AnT

@AnT: Emin misin? Sanırım Windows'daki *.*gibi davranıyor *. Aslında, sadece bilgisayarımda denedim ve dir *.*gerçekten de test fileuzantısız bir dosyayı listeledim .
Andreas Rejbrand

1
@Andreas Rejbrand: Ben de şaşırtıcı buluyorum, ama tedavisi *.*, diyelim dirve -mseçeneği arasında tutarsız forfiles. -m *.*Yukarıda benim yorumum (kendiniz deneyin) belirtildiği gibi maske gerçekten extensionless dosya adlarını atlayacak. Buradaki komik kısım, MS belgelerinin -m *.*varsayılan olduğunu açıkça belirtmesidir . Ancak, gerçek hayatta denerseniz, varsayılanın aslında olduğunu görürsünüz -m *- tüm dosyalar yinelenir.
AnT

1
Bu MS dokümantasyon sayfası - technet.microsoft.com/en-us/library/cc753551(v=ws.11).aspx - dokümanın yazarı *.*maskenin uygulandığına yanlış inandığından çok sayıda hata içeriyor (örneğin örneklerde) tüm dosyalara. "Bu garip alışkanlık" hakkındaki rethorik sorum gerçekten de tartışılmazdı, çünkü tedavi etmek *.*ve *eşdeğer olarak uzun zamandır devam eden bir Windows sözleşmesi. Ancak, herhangi bir nedenle bu sözleşmeyi ihlal etme /mseçeneği ortaya forfilesçıkar.
AnT

1
Windows'ta 5 joker karakterle ilgili arka plan : blogs.msdn.microsoft.com/jeremykuhne/2017/06/04/…
MSalters

18

Benim göz at cevap a benzer soru :

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"

Bu, belirli bir tarihten daha eski dosyaları siler. Mevcut tarihten itibaren yedi gün geri dönmek için değiştirilebileceğinden eminim.

Güncelleme: HerbCSO'nun yukarıdaki komut dosyasında iyileştiğini fark ettim. Onun yerine sürümünü kullanmanızı öneririm .


12

Benim emrim

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

@PATH - sadece benim durumumdaki yol, bu yüzden kullanmak zorunda kaldım @PATH\@FILE

Ayrıca forfiles /?benim için çalışmıyor, ama forfiles("?" olmadan) iyi çalıştı.

Ve tek sorum var: birden fazla maske nasıl eklenir (örneğin " .log | .bak")?

Burada indirdiğim forfiles.exe ile ilgili tüm bunlar (win XP'de)

Ancak Windows sunucusu kullanıyorsanız forfiles.exe zaten orada olmalı ve ftp sürümünden farklıdır. Bu yüzden komutu değiştirmeliyim.

Windows Server 2003 için bu komutu kullanıyorum:

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

9

Toplu iş dosyasıyla çözmek için çok sık göreceli tarih / saatle ilgili sorular vardır. Ancak cmd.exe komut satırı yorumlayıcısı , tarih / saat hesaplamaları için bir işleve sahip değildir. Ek konsol uygulamaları veya komut dosyaları kullanan birçok iyi çalışma çözümü zaten burada, Stack Overflow'un diğer sayfalarında ve diğer web sitelerinde yayınlanmıştır.

Tarih / saate dayalı işlemler için ortak bir tarih / saat dizesini belirli bir günden bu yana saniyeye dönüştürme gereksinimi vardır. Çok yaygın olan 1970-01-01 00:00:00 UTC. Ancak belirli bir görevi desteklemek için gereken tarih aralığına bağlı olarak daha sonraki bir gün de kullanılabilir.

Jay komut satırı yorumlayıcısı cmd.exe için hızlı bir "tarih-saniye" çözümü içeren 7daysclean.cmd gönderdi . Ancak artık yılları doğru olarak dikkate almıyor. JR , cari yıldaki atılım gününü hesaba katarak, ancak taban yıldan bu yana, diğer bir deyişle 1970'den bu yana diğer atılım yıllarını göz ardı ettiği için bir eklenti yayınladı .

C / C ++ ile yazılmış uygulamalarımda 1970-01-01 tarih / saat dönüştürme işlevlerinde artık günler de dahil olmak üzere gün sayısını hızlı bir şekilde elde etmek için 20 yıldan beri küçük C fonksiyonu ile oluşturulan statik tabloları (diziler) kullanıyorum.

Bu çok hızlı tablo yöntemi, FOR komutu kullanılarak toplu kodda da kullanılabilir . Bu yüzden GetSecondsbu rutine geçen bir tarih / saat dizesi için 1970-01-01 00:00:00 UTC'den bu yana saniye sayısını hesaplayan toplu alt rutini kodlamaya karar verdim .

Not: Windows dosya sistemleri artık saniyeleri de desteklemediğinden artık saniye dikkate alınmaz.

İlk olarak, tablolar:

  1. Artık günler dahil olmak üzere her yıl için 1970-01-01 00:00:00 UTC.

    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
    

    1970-01-01'den başlayarak, 2039 ila 2106 yılları için saniyelerin hesaplanması yalnızca C / C ++ 'da imzasız 32 bit değişken, yani imzasız uzun (veya imzasız int) kullanılarak mümkündür.

    Ancak cmd.exe matematiksel ifadeler için imzalı bir 32 bit değişkeni kullanır. Bu nedenle, maksimum değer 2038-01-19 03:14:07 olan 2147483647'dir (0x7FFFFFFF).

  2. 1970 - 2106 yılları için artık yıl bilgisi (Hayır / Evet).

    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. İçinde bulunulan yılda her ayın ilk gününe kadar olan gün sayısı.

                       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
    

1970-01-01'den beri bir tarihi saniye sayısına dönüştürmek bu tabloları kullanarak oldukça kolaydır.

Lütfen dikkat!

Tarih ve saat dizelerinin biçimi Windows bölgesine ve dil ayarlarına bağlıdır. Sınırlayıcı ve ortam değişkenleri atanan jeton sırası Day, Monthve Yearilk İÇİN ait döngü GetSecondsgerekirse yerel tarih / saat biçimine adapte edilmelidir.

DATE ortam değişkenindeki tarih biçimi FOR on komutu tarafından kullanılan tarih biçiminden farklıysa , ortam değişkeninin tarih dizesini uyarlamak gerekir %%~tF.

Örneğin, ne zaman %DATE%için genişler Sun 02/08/2015süre %%~tFiçin genişler 02/08/2015 07:38 PMaşağıdaki kod hattı 4 modifiye ile birlikte kullanılabilir:

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

Bu, alt rutine sadece 02/08/2015- hafta içi kısaltmanın 3 harfi ve ayırıcı boşluk karakteri olmayan tarih dizesine geçilmesine neden olur .

Alternatif olarak, şu anki tarihi doğru biçimde geçirmek için aşağıdakiler kullanılabilir:

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

Artık tarih dizesindeki son 10 karakter işleve geçirilir GetSecondsve bu nedenle, DATE ortam değişkeninin tarih dizesinin gün ve ay her zaman beklenen sırada, yani biçim dd/mm/yyyy veya 2 basamaklı olduğu sürece hafta içi olsun veya olmasın önemli değildir dd.mm.yyyy.

Burada hangi dosyanın silineceğini ve hangi dosyanın C:\Tempklasör ağacında saklanacağını açıklayan yorumları içeren toplu kod, ilk FOR döngüsünün koduna bakı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

En iyi performans için tüm yorumları, yani 0-4 önde gelen boşluktan sonra rem ile başlayan tüm satırları kaldırmak en iyisidir .

Ve diziler de daha küçük hale getirilebilir, yani şu anda yukarıdaki toplu kodla desteklendiği gibi, 1980-01-01 00:00:00 - 2038-01-19 03:14:07 arasındaki zaman aralığını düşürmek, örneğin 2015-01 Aşağıdaki kod olarak -01 ila 2019-12-31 C:\Tempklasör ağacında 7 günden eski dosyaları gerçekten silen kullanır .

Ayrıca, aşağıdaki parti kodu 24 saat formatı için optimize edilmiştir.

@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

Windows'ta tarih ve saat biçimleri ve dosya saati karşılaştırmaları hakkında daha fazla bilgi için , toplu iş dosyasında dosya süreleri hakkında birçok ek bilgi içeren 4 saatten daha eski olup olmadığını bulma konusundaki cevabım bakın .


9

Bu kodu kopyalayın ve olarak kaydedin DelOldFiles.vbs.

CMD'DE KULLANIM: cscript //nologo DelOldFiles.vbs 15

15, 15 günden daha eski dosyaları silmek anlamına gelir.

  '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

Windows Server 2008 R2 için:

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

Bu işlem 90 günden eski tüm .sql dosyalarını silecektir .


7

Dosya kullanın.

Farklı versiyonları vardır. İlk olanlar unix stil parametreleri kullanır.

Sürümüm (sunucu 2000 için - anahtarlardan sonra boşluk olmadığını unutmayın) -

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

XP'ye dosya eklemek için exe'yi ftp://ftp.microsoft.com/ResKit/y2kfix/x86/ adresinden edinin.

ve C: \ WINDOWS \ system32 dizinine ekleyin


11
@Kibbee sözdiziminin farklı olduğu aynı cevap değil. Bu yardımcı bir geniune girişimiydi. Windows komut satırının çok azını bilerek, işe yaraması için saatler süren hayal kırıklığı yaşadım. Benim için en önemli bilgi parçaları (farklı sözdizimi ile) farklı sürümler olması ve boşlukları kaldırmam gerektiğiydi. Bunların hiçbiri orijinal cevaba dahil edilmedi. (Cevaba yorum yapardım ama imtiyazım yok
Aidan Ewen

Diğer cevaplardaki hata (kabul edilen cevap dahil). Joker *.*içinde forfileseşleşmeyen tüm dosyaları. Yalnızca .adlarındaki dosyalarla eşleşir (ör. Uzantı içeren dosyalar). OP ., dosya adının istenmesi hakkında hiçbir şey söylemedi . Doğru parametre /M *, ancak bu zaten varsayılan değerdir. Hiç gerek yok /M.
AnT

7

Windows 2012 R2 için aşağıdakiler işe yarar:

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

silinecek dosyaları görmek için bunu kullanın

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

Bu bile Windows Server 2008 ve üzeri ve Windows 7'de çalışır.
kwrl

6

IMO, JavaScript yavaş yavaş evrensel bir komut dosyası standardı haline geliyor: muhtemelen diğer komut dosyası dillerinden daha fazla üründe kullanılabilir (Windows'ta Windows Komut Dosyası Ana Bilgisayarı kullanılarak kullanılabilir). Çok sayıda klasördeki eski dosyaları temizlemek zorunda, bu yüzden bunu yapmak için bir JavaScript işlevi:

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

Her klasörün temizlenmesi için, clearFolder () işlevine başka bir çağrı eklemeniz yeterlidir. Bu özel kod exe ve dll dosyalarını da korur ve alt klasörleri de temizler.


6

Bir sıçrama yılını hesaba katmak için 7daysclean.cmd'deki bu değişikliğe ne dersiniz ?

10 satırdan daha az kodlama ile yapılabilir!

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

Mofi tarafından düzenle:

JR'nin katkıda bulunduğu yukarıdaki durum , geçersiz sözdizimi nedeniyle her zaman yanlış olarak değerlendirilir .

Ve Month GEQ 2aynı zamanda yanlış çünkü bir gün daha 86400 saniye eklemek artık Mart-Aralık ayları için bir sıçrama yılında yapılmalıdır, ancak Şubat için değil.

Artık günü dikkate almak için çalışan kod - yalnızca geçerli yılda - Jay tarafından gönderilen 7daysclean.cmd toplu dosyasında :

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

Zaten değerli olan bu konuya mütevazı bir katkı ekleyebilir miyim? Diğer çözümlerin gerçek hata metninden kurtulabileceğini, ancak benim uygulamada bir hata sinyalleri% ERRORLEVEL% görmezden buluyorum. VE "Dosya bulunamadı" hatası olmadığı sürece% ERRORLEVEL% 'i yasal olarak istiyorum.

Bazı örnekler:

Hata ayıklama ve hatayı özellikle ortadan kaldırma:

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

ERRORLEVEL başarısını veya başarısızlığını döndürmek için bir oneliner kullanma:

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

Diğer kodun ortasında bir toplu iş dosyası bağlamında başarı için ERRORLEVEL'i sıfırda tutmak üzere bir oneliner kullanmak (ver> nul ERRORLEVEL'i sıfırlar):

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

Bir SQL Server Agent CmdExec iş adımı için aşağıdakilere indi. Bu bir hata olup olmadığını bilmiyorum, ancak adım içindeki CmdExec sadece kodun ilk satırını tanır:

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

Tanrım, zaten birçok cevap var. Bulduğum basit ve kullanışlı bir yol, & parametresini kullanarak tek bir Windows komut satırı komutundan ROBOCOPY.EXE'yi iki kez sıralı olarak yürütmekti .

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

Bu örnekte , 30 günden daha eski olan tüm dosyaları ( . ) Seçip hedef klasöre taşıyarak çalışır. İkinci komut , hedef klasördeki kaynak klasörde bulunmayan dosyaları kaldırmak anlamına gelen PURGE komutunun eklenmesiyle tekrar aynısını yapar . Esasen, ikinci komut çağrıldığında kaynak klasörde artık bulunmadığından, ilk komut MOVES dosyaları ve ikinci DELETES dosyaları.

ROBOCOPY'nin belgelerine bakın ve test ederken / L anahtarını kullanın.


4

XP kaynak kitiniz varsa, tüm eski dizinleri tek bir dizine taşımak için robocopy'yi kullanabilirsiniz, ardından yalnızca bu dizini silmek için rmdir komutunu kullanabilirsiniz:

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

4

E.James'in yanıtı , Windows 2000 SP4 (ve muhtemelen daha önce) gibi erken değiştirilmemiş Windows sürümleriyle çalıştığı için iyi olduğunu düşünüyorum , ancak harici bir dosyaya yazılması gerekiyordu. Uyumluluğu korurken harici bir metin dosyası oluşturmayan değiştirilmiş bir sürüm:

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)

Orijinal soruya sadık olmak için, parametre olarak gün sayısı ile çağırırsanız, sizin için TÜM matematiği yapan bir komut dosyasındadır:

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)

NOT: Yukarıdaki kod, artık yılları ve her aydaki tam gün sayısını dikkate alır. Tek maksimum, 0/0/0 tarihinden bu yana geçen toplam gün sayısıdır (bundan sonra negatif yıl döndürür).

NOT: Matematik sadece bir yöne gider; negatif girişlerden gelecekteki tarihleri ​​doğru şekilde alamaz (dener, ancak muhtemelen ayın son gününü geçecektir).


3

Bunu çekebilirsin. Daha basit bir örnek için bu soruya göz atabilirsiniz . Tarihleri ​​karşılaştırmaya başladığınızda karmaşıklık gelir. Tarihin daha büyük olup olmadığını söylemek kolay olabilir, ancak iki tarih arasındaki farkı gerçekten almanız gerekiyorsa dikkate alınması gereken birçok durum vardır.

Başka bir deyişle - üçüncü taraf araçlarını gerçekten kullanamazsanız, bunu icat etmeye çalışmayın.


3

Bu şaşırtıcı bir şey değil, ama bugün böyle bir şey yapmam ve zamanlanmış görev olarak çalıştırmam gerekiyordu.

toplu iş dosyası, DelFilesOlderThanNDays.bat aşağıdaki örnek exec w / params ile:

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

3

Aku'nun cevabına doğru genişlerken, birçok insanın UNC yollarını sorduğunu görüyorum. Unc yolunu bir sürücü harfiyle eşleştirmek, dosyaları mutlu edecektir. Sürücülerin eşlenmesi ve eşleştirmesinin kaldırılması, örneğin bir toplu iş dosyasında programlı olarak yapılabilir.

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"

Bu işlem, .gz uzantılı 7 günden eski tüm dosyaları silecektir. Z: 'yi kullanmadan önce başka bir şeyle eşlenmediğinden emin olmak istiyorsanız,

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 benim için harika çalışıyor. Aslında benim Iman'ı önerdi. Ancak dosyaları / klasörleri geçici bir dizine taşımak yerine geçici klasörün içeriğini silmek yerine , dosyaları çöp kutusuna taşıyın !!!

Bu benim yedekleme toplu iş dosyamın birkaç satır olduğunu:

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

'Temp' klasörümden 15 günden eski ve AutoCAD yedek klasörümdeki 30 günden eski her şeyi temizler. Değişkenleri kullanıyorum çünkü çizgi oldukça uzayabiliyor ve bunları diğer konumlar için tekrar kullanabiliyorum. Oturum açmanızla ilişkili geri dönüşüm kutunuzun dos yolunu bulmanız yeterlidir.

Bu benim için bir iş bilgisayarında ve işe yarıyor. Bazılarınızın daha kısıtlayıcı haklara sahip olabileceğini anlıyorum, ancak yine de deneyin;) ROBOCOPY parametreleriyle ilgili açıklamalar için Google'da arama yapın.

Şerefe!


1
En çok oylanan ikinci cevap da RoboCopy'yi destekliyor. Elbette, biraz farklı seçenekler kullanıyorsunuz, ancak mevcut cevaba yakın.
Jonathan Leffler

2
Bu yayında yeni bir içerik var - dosyaları geri dönüşüm kutusuna taşıyor. Bu Robocopy ile henüz önerilmemiştir ve yerleşik tek satırlı komut kullanarak orijinal postayı tamamen yanıtlar. Dosyalar 'geri dönüşüm kutusundan geri yüklenebildiğinden' DEL 've' RMDIR 'komutlarını birleştirmekten daha iyi çalışır. Hey hala burada yeniyim - bana bir mola verin;)
Shawn Pauliszyn

2

Belirli bir yıldan daha eski dosyaları silme komut dosyam:

@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

Bu benim için yaptı. Bir tarih ile çalışır ve zamanda geriye gitmek için istenen miktarı yıllara göre özetleyebilirsiniz:

@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

/Fiçinde cmd /c del @path /Fkuvvetler belirli dosya dosya salt okunabilir bazı durumlarda silinecek.

dateYearyıl Değişken ve kendi ihtiyaçlarına substract orada değiştirebilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.