Batch file per eliminare i file più vecchi di N giorni

Sto cercando un modo per eliminare tutti i file più vecchi di 7 giorni in un file batch. Ho cercato in giro per il web, e ho trovato alcuni esempi con centinaia di righe di codice, e gli altri che hanno richiesto l’installazione extra utilità della riga di comando per realizzare il compito.

Cose simili possono essere fatto in BASH in appena un paio di righe di codice. Sembra che qualcosa di almeno lontanamente facile potrebbe essere fatto per i file batch di Windows. Sto cercando una soluzione che funziona in un prompt standard di Windows, senza alcuna utilità. Si prega di non PowerShell o Cygwin o.

InformationsquelleAutor Kibbee | 2008-09-09



23 Replies
  1. 1019

    Godere:

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

    Vedere forfiles documentazione per ulteriori dettagli.

    Per di più chicche, si riferiscono a Di un Indice A-Z di Windows XP riga di comando.

    Se non hai forfiles installato sulla vostra macchina, copiare da qualsiasi Windows Server 2003 per Windows macchina XP a %WinDir%\system32\. Questo è possibile in quanto il file EXE è pienamente compatibile con Windows Server 2003 e Windows XP.

    Versioni successive di Windows e Windows Server di averlo installato per impostazione predefinita.

    Per Windows 7 e versioni più recenti (tra cui Windows 10):

    La sintassi è un po ‘ cambiate. Pertanto l’aggiornamento del comando è:

    forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"
    
    • Non ho forfiles sul mio XP (sp3) – macchina da dove viene?
    • Dovrebbe essere del @FILE, in caso di questioni Anche io suggerisco di usare /c echo @FILE per il test
    • è il percorso completo, compreso il nome. @FILE è solo il nome, quindi se hai a che fare con le sottocartelle, non funziona.
    • Si noti che se si desidera che i file più VECCHI di 10 giorni, è necessario specificare l’opzione-d “-10”. -ve significa “più vecchio”, +ve significa “più recente”. È inoltre possibile specificare GGMMAA o -formato GGMMAA come parametro a-d.
    • Quando l’ho testato con Windows 7, @PERCORSO è stato solo il percorso, e @FILE era solo il nome del file. Ho usato @PATH\@FILE per il comando del.
    • Bene si impara qualcosa di nuovo ogni giorno… mai venire attraverso forfiles prima 🙂
    • Inoltre, se si desidera ottenere il file da un’altra unità: per esempio tutti i file rar più vecchi di 30 giorni C:\Windows\System32>forfiles -p “F:\\” -m *.rar -d -30 -c “cmd /c echo Questi wil l essere eliminati @fname” Questi saranno eliminati “File1” Questi saranno eliminati “File2”
    • Ho usato questa sintassi su Win Server 2008: forfiles /P “C:\Mysql_backup” /S /M *.sql /D -30 /C “cmd /c del @PATH”
    • anche l’aggiunta di un ECHO “Y” ha aiutato con le sei sicuro ? messaggi come questo: “cmd /c echo “Y” | del @PATH” alla fine
    • Incredibile, ma è troppo tardi per me, come ho fatto la decisione consapevole di non scrivere un file batch di nuovo, e forza a me stesso di andare esclusivamente con PowerShell.
    • Grazie. Vorrei aggiungere che, se i giorni è inferiore a quello che si sta cercando di eliminare l’errore sarà stato nessun file corrispondente sono stati trovati. Questo è corretto.
    • ricordate che il numero di giorni deve essere negativa, diciamo per esempio /d -10 cancella tutto prima di 10 giorni. Un valore positivo rende quasi senza senso.
    • Avviso: Se si sta solo cercando di eliminare i file copiati N giorni fa, questo non è ciò che si dovrebbe utilizzare. Io ho semplicemente copiato alcuni file ed eseguire ‘forfiles /P “path” /S /C “cmd /c echo @file” /D -31’ su di loro, e i file che erano modificato più di 31 giorni fa visualizzato.
    • Questa risposta funziona quando “più vecchi di 7 giorni” è definito come “modificato più di 7 giorni fa” piuttosto che “creato più di 7 giorni fa”. Come quest’ultimo può essere raggiunto?
    • Purtroppo, sulla condivisione di file di destinazione dà l’errore: “ERRORE: i percorsi UNC percorsi (\\machine\share) non sono supportati”
    • Questo non nativamente lavoro su XP Professional.
    • Ho adattato questo si usa il comando SPOSTA invece di DEL per archiviare i vecchi file in un’altra cartella computerhope.com/movehlp.htm
    • Per passare i file Bloccati / file in uso da un altro processo (invece di appendere quando si incontra) — l’uso remove.exe da virtualobjectives.com.au/utilitiesprogs/remove.htm
    • Ehm… Perché questa risposta è posta la “aggiornato” versione della riga di comando, ma utilizza ancora vecchi sintassi per circa la metà delle opzioni della riga di comando che “aggiornato” versione? Ufficiale sintassi della riga di comando in Windows forfiles inizia con /, non con -. Inoltre, qual è il *.* searchmask facendo lì? Questo restringe il campo di applicazione per i file di . nei loro nomi. Perché? L’OP mai fatto richiesta. L’impostazione predefinita searchmask per forfiles è * e sembra che l’OP ha bisogno di esattamente che. Il che significa che non c’è bisogno di /M parametro a tutti.
    • Nota che il non-Windows 7 sintassi richiede un trattino (-) prima del <numero di giorni> per lavoro.
    • Non ho visto nessuno parlare che si dovrebbe usare se @isdir==FALSE di elaborare solo i file e non le cartelle. Altrimenti si potrebbe accidentalmente eliminare tutti i file in una cartella. Esempio: forfiles -p “C:\what\ever” -s -m . /D -<numero di giorni> /C “cmd /c, se @isdir==FALSE del @path”
    • Ciao, gregmac. Sei sicuro di questo? Faccio la prova e trovato @file funziona anche per i file in sottocartelle
    • in Windows 7, il percorso di directory non deve essere il doppio citato. Vedere stackoverflow.com/questions/1039221/…
    • Un altro modo per evitare “sei sicuro” messaggi è del /F /Q @path – vedi stackoverflow.com/questions/7160342#7160366.
    • Grazie per l’eco “Y”, ho 193k file da eliminare e rispondendo ad ogni prompt era un no-go!
    • c’è un modo per applicare sui sub directory?
    • non lavorare su una posizione condivisa

  2. 74

    Eseguire il seguente comandi:

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

    Spostare tutti i file (utilizzando /mov, che sposta i file e poi li cancella come contrasto /spostare il quale si muove tutta la filetrees che vengono poi eliminati) via robocopy per un’altra posizione, e quindi eseguire un comando delete sul percorso che state tutti bene.

    Anche se si dispone di una directory con un sacco di dati che è possibile utilizzare /mir interruttore

    • Per la maggior parte, questo è abbastanza impraticabile risposta. Se ho una directory con un sacco di dati, non c’è la volontà di non funzionare bene. Mi piacerebbe andare con una risposta che non è “a posto”
    • questo non è in alcun modo impraticabile, se “destinazione” è sullo stesso filesystem come “source”, l’operazione di spostamento è abbastanza leggero. Come robocopy è davvero robusto, di fatto opera per qualsiasi dimensione di directory, oscurare i nomi di file, sostanzialmente arbitrario lunghezze di percorso e directory, se avete bisogno di qualcosa che sicuramente non si può dire di molti altri programmi di utilità di Windows. Vorrei utilizzare rd /s /q c:\destination invece di del comando o se anche utilizzare un altro robocopy /mir c:\emptydir c:\destination eseguire per svuotare la directory se si aspettano problemi con i nomi di file.
    • Inoltre, robocopy non supporta i percorsi UNC – che forfiles dal accettati risposta non fare.
    • I miei pensieri erano di più lungo le linee di: “i Miei file sono già dove voglio. Non voglio muovere loro.” “L’eliminazione di file è logicamente quello che stai facendo, in modo da farlo. Non sovraccaricare di Robocopy per farlo”
    • Mi raccomando questa one-liner per la visualizzazione di tutti i file in C:\test più vecchi di 7 giorni. Per eliminare i file, modificare le echo per del: forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
    • ROBOCOPY C:\source C:\destination /spostare /s /minage:7 copia i file nella sottodirectory.
    • Sbagliato. Come si fa a invitare questo per vedere la file, quando si specificato in modo esplicito un restrittive *.* jolly? Il *.* non vedere tutti i file. Sarà solo vedere i file con . nei loro nomi. Hai bisogno di * wilcard per vedere tutti i file, non *.*. Inoltre * è la default jolly vincere forfiles, il che significa che se si desidera scorrere sopra di tutto, il parametro /M deve essere rimosso completamente.

  3. 24

    Ok era annoiato un po ‘ ed è uscito questo, che contiene la mia versione di un uomo povero Linux epoca di sostituzione limitata per l’utilizzo quotidiano (non c’è tempo di ritenzione):

    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
    

    UTILIZZO

    set /a strip=day*7 : Cambiare 7 per il numero di giorni di conservazione.

    set dSource=C:\temp : Questa è la directory di partenza per controllare file.

    NOTE

    Questo non è distruttivo codice, viene visualizzato ciò che sarebbe accaduto.

    Modifica :

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

    a qualcosa di simile :

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

    così file viene eliminato

    Febbraio: è hard-coded per 28 giorni. Bissextile anni è un inferno per aggiungere, davvero. se qualcuno ha un’idea che non sarebbe aggiungere 10 righe di codice, andare avanti e post, così ho aggiunto al mio codice.

    epoca: non ho preso in considerazione il tempo, come la necessità di eliminare i file più vecchi di una certa data, l’assunzione di ore/minuti avrebbe cancellato i file da un giorno che è stato significato per la conservazione.

    LIMITAZIONE

    epoca prende per scontato il formato di data breve, è YYYY-MM-DD. Si avrebbe bisogno di essere adattato per altre impostazioni o l’esecuzione, la valutazione (leggi sShortTime, utente associato di configurazione, configurare il corretto ordine dei campi in un filtro e utilizzare il filtro per estrarre i dati corretti dall’argomento).

    Mi ha fatto ricordare che io odio questo editor di auto-formattazione? elimina le righe vuote e il copia-incolla è un inferno.

    Spero che questo aiuta.

    • +1 non distruttiva del codice, cercherò di tenere questo in mente quando ho fornire esempi di codice me.
    • Modo fine e completamente estranei, ma 7daysclean.cmd suona come un fantastico nome per un Synth-Punk.
  4. 19
    forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"
    

    Si dovrebbe fare /d -3 (3 giorni prima) Questo funziona bene per me. Così tutti i complessi lotti potrebbe essere nel cestino. Anche forfiles non supportano i percorsi UNC, in modo da creare una connessione di rete ad una specifica unità.

    • Stesso errore, come in altre risposte (tra cui accettato uno). Da dove viene questa strana abitudine di specificare *.* provengono da? Jolly *.* non corrisponde a tutti i file in Windows. Solo le partite di file con . nei loro nomi. L’OP non ha mai detto nulla circa posto . nel nome del file. Il corretto parametro è /M *, ma questa è l’impostazione predefinita in ogni caso. Non c’è bisogno di /M a tutti.
    • Sei sicuro? Penso *.* si comporta esattamente come * in Windows. Infatti, ho appena provato sul mio computer, e dir *.* elencato test file, un file senza estensione.
    • Rejbrand: io trovo sorprendente, ma il trattamento di *.* è incoerente tra, diciamo, dir e -m opzione di forfiles. Il -m *.* maschera sarà davvero saltare extensionless nomi di file, come ho detto nel mio commento precedente (provate anche voi). Il bello qui è che MS documentazione esplicitamente che -m *.* è l’impostazione predefinita. Tuttavia, se si prova nella vita reale, vedrai che il valore di default è in realtà -m * – tutti i file sono iterato.
    • Questo MS pagina di documentazione – technet.microsoft.com/en-us/library/cc753551(v=rovescio del lavoro.11).aspx – contiene un gran numero di errori (ad esempio in esempi) perché l’autore del doc erroneamente creduto che *.* maschera applicata al file.
    • Questo MS pagina di documentazione – technet.microsoft.com/en-us/library/cc753551(v=rovescio del lavoro.11).aspx – contiene un gran numero di errori (ad esempio in esempi) perché l’autore del doc erroneamente creduto che *.* maschera applicata a tutti i file. La mia domanda retorica su “questa strana abitudine” era davvero superflue, dal momento che il trattamento *.* e * come equivalente è una lunga Windows convenzione. Tuttavia, /m opzione forfiles succede a violare la convenzione per qualche motivo.
    • Sfondo su 5 caratteri jolly in Windows: blogs.msdn.microsoft.com/jeremykuhne/2017/06/04/…

  5. 17

    Dare un’occhiata al mio risposta per un domanda simile:

    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"
    

    Questo consente di eliminare i file più vecchi di una certa data. Sono sicuro che può essere modificato per tornare a sette giorni dalla data corrente.

    aggiornamento: ho notato che HerbCSO ha migliorato lo script qui sopra. Mi consiglia di utilizzare la sua versione invece.

  6. 12

    Mio comando è

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

    @PATH – è appena percorso, nel mio caso, ho avuto modo di utilizzare @PATH\@FILE

    anche forfiles /? non funziona per me, ma forfiles (senza “?”) ha funzionato bene.

    E l’unico dubbio che ho: come aggiungere più maschera (per esempio “.log|.bak”)?

    Tutto questo per quanto riguarda forfiles.exe che I scaricato qui (su win XP)

    Ma se si utilizza Windows server forfiles.exe dovrebbe essere già lì, ed è diverso da ftp versione. Che è il motivo per cui dovrei modificare comando.

    Windows Server 2003 che sto usando questo comando:

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

    Per Windows Server 2008 R2:

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

    Questo cancellerà tutti i .sql i file più vecchi di 90 giorni.

  8. 7

    Utilizzare forfiles.

    Ci sono diverse versioni. Presto un utilizzo in stile unix parametri.

    La mia versione (per server 2000 – nota senza spazio dopo interruttori)-

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

    Per aggiungere forfiles di XP, ottenere il file exe da ftp://ftp.microsoft.com/ResKit/y2kfix/x86/

    e aggiungere C:\WINDOWS\system32

    • non è la stessa risposta la sintassi è diversa. Questo è stato un geniune tentativo di aiuto. Knowning molto poco della riga di comando di windows, ho trascorso ore di frustrazione ottenere questo lavoro. La chiave di bit di informazioni per me il fatto che ci sono varie versioni (con una sintassi diversa), e che ho rimosso gli spazi. Nessuna di queste cose sono state incluse nella prima risposta. (Avrei commentato la risposta, ma non ho i privilegi
    • Stesso errore, come in altre risposte (tra cui accettato uno). Jolly *.* in forfiles non corrisponde a file. Solo le partite di file con . nella loro nomi (ad es. file con le estensioni). L’OP non ha mai detto nulla circa posto . nel nome del file. Il corretto parametro è /M *, ma questa è l’impostazione predefinita in ogni caso. Non c’è bisogno di /M a tutti.
  9. 7

    Per windows 2012 R2 il seguente lavoro:

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

    per vedere i file che verranno eliminati utilizzare questo

        forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate"
    
    • Questo funziona anche in Windows Server 2008 e Windows 7.
  10. 7

    Ci sono, molto spesso, relativa data/ora le domande relative a risolvere con un file batch. Ma interprete a riga di comando cmd.exe ha alcuna funzione data/ora di calcoli. Un sacco di buone soluzioni per il lavoro con ulteriori applicazioni console o script sono stati pubblicati già qui, in altre pagine di Stack Overflow e su altri siti web.

    Comune per le operazioni di base a data/ora è il requisito per la conversione di una stringa data/ora di secondi da un determinato giorno. Molto comune è 1970-01-01 00:00:00 UTC. Ma qualche giorno più tardi potrebbe essere utilizzato anche in base alla data di gamma è richiesto il supporto di un compito specifico.

    Jay inviato 7daysclean.cmd contenente un veloce “data di secondi” soluzione per interprete a riga di comando cmd.exe. Ma non prendere anni bisestili corretta in considerazione. J. R. R. Tolkien. inviato un add-on per l’assunzione di leap giorno nell’anno in corso in considerazione, ma ignorando gli altri anni bisestili dal anno base, cioè dal 1970.

    Io uso da 20 anni, tabelle statiche (matrici) creato una volta con una piccola funzione C per ottenere rapidamente il numero di giorni tra cui balzo giorni dalla 1970-01-01 in data/ora funzioni di conversione nel mio applicazioni scritte in C/C++.

    Questo molto veloce metodo della tabella può essere utilizzato anche nel codice del lotto utilizzando PER comando. Così ho deciso di codice batch subroutine GetSeconds che calcola il numero di secondi dal 1970-01-01 00:00:00 UTC per una stringa data/ora passato a questa routine.

    Nota: secondi non sono presi in considerazione in quanto il file system di Windows, inoltre, non supportano secondi.

    Prima, le tabelle:

    1. Giorni da 1970-01-01 00:00:00 UTC per ogni anno, tra cui salto giorni.

      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
      

      Calcolare i secondi per l’anno 2039 per 2106 epoca con inizio 1970-01-01 è possibile solo con l’utilizzo di un segno senza segno a 32 bit variabile, cioè unsigned long (o unsigned int) in C/C++.

      Ma cmd.exe utilizzare per le espressioni matematiche, firmato a 32-bit variabile. Pertanto, il valore massimo è 2147483647 (0x7FFFFFFF) che è 2038-01-19 03:14:07.

    2. Anno bisestile informazioni (No/Sì) per gli anni 1970 e 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. Numero di giorni per il primo giorno di ogni mese nell’anno in corso.

                         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
      

    Conversione di una data per il numero di secondi da 1970-01-01 è piuttosto semplice utilizzando le tabelle.

    Attenzione!

    Il formato di data e ora stringhe dipende dalla regione di Windows e le impostazioni di lingua. I delimitatori e l’ordine di token ricevuto le variabili di ambiente Day, Month e Year in primo PER ciclo di GetSeconds deve essere adeguato alla realtà locale formato di data/ora, se necessario.

    È necessario adattare la data stringa della variabile di ambiente se il formato della data nella variabile di ambiente DATA è diversa data in formato utilizzato dal comando PER su %%~tF.

    Per esempio quando %DATE% si espande per Sun 02/08/2015 mentre %%~tF si espande per 02/08/2015 07:38 PM il codice riportato di seguito può essere utilizzato con la modifica linea 4:

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

    Questo si traduce nel passaggio alla subroutine solo 02/08/2015 – data stringa senza il 3 lettere dei giorni della settimana abbreviazione e la separazione carattere di spazio.

    In alternativa potevano essere utilizzato per passare la data corrente nel formato corretto:

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

    Ora gli ultimi 10 caratteri dalla stringa di data sono passati alla funzione GetSeconds e, pertanto, non importa se una data stringa della variabile di ambiente DATA è con o senza feriali, come lungo come il giorno e il mese sono sempre con 2 cifre nell’ordine previsto, cioè in formato dd/mm/yyyy o dd.mm.yyyy.

    Qui è il codice del lotto spiegando commenti che emette solo il file da eliminare e il file da tenere in C:\Temp albero delle cartelle, vedere il codice di prima PER loop.

    @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
    

    Per prestazioni ottimali sarebbe meglio rimuovere tutti i commenti, cioè tutte le linee che iniziano con rem dopo 0-4 spazi iniziali.

    E le matrici possono essere fatte anche più piccoli, cioè diminuendo l’intervallo di tempo 1980-01-01 00:00:00 alle 2038-01-19 03:14:07 come attualmente supportati dal codice del lotto di cui sopra, per esempio, 2015-01-01 per 2019-12-31 come il codice riportato di seguito utilizza che davvero consente di eliminare i file più vecchi di 7 giorni in C:\Temp albero delle cartelle.

    Ulteriormente il codice del lotto di seguito è ottimizzato per 24 ore in formato.

    @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
    

    Per ulteriori informazioni riguardo formati di data e ora e il momento di confronto su Windows vedi la mia risposta a Scoprire se il file è più vecchio di 4 ore in file batch con un sacco di ulteriori informazioni sui file di volte.

  11. 7

    Copia questo codice e salvarlo come DelOldFiles.vbs.

    UTILIZZO IL COMANDO “CMD”: cscript //nologo DelOldFiles.vbs 15

    15 mezzi per eliminare i file più vecchi di 15 giorni nel passato.

      '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
    
  12. 6

    IMO, JavaScript sta gradualmente diventando un universale di script standard: probabilmente è disponibile in più di prodotti di qualsiasi altro linguaggio di scripting (in Windows, è disponibile utilizzando il Windows Scripting Host). Devo pulire i vecchi file in un sacco di cartelle, così qui è una funzione JavaScript per farlo:

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

    Per ogni cartella da cancellare, basta aggiungere un’altra chiamata al clearFolder() funzione. Questo particolare codice conserva anche il file exe e dll, e pulisce le sottocartelle così.

  13. 6

    Che ne dite di questa modifica su 7daysclean.cmd di prendere un anno bisestile in considerazione?

    Può essere fatto in meno di 10 righe di codice!

    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
    

    Modifica da Mofi:

    La condizione di cui sopra ha contribuito da J. R. R. Tolkien. valuta sempre false a causa di sintassi non valida.

    E Month GEQ 2 è anche sbagliato, perché l’aggiunta di 86400 secondi per un giorno in più deve essere fatto in un anno bisestile solo per i mesi da Marzo a dicembre, ma non per il mese di febbraio.

    Un codice di lavoro di prendere il salto di giorno in considerazione – nel solo anno corrente – in file batch 7daysclean.cmd inviato da Jay sarebbe:

    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
    
  14. 5

    Potrei aggiungere un umile contributo a questo già prezioso thread. Mi sto trovando che altre soluzioni potrebbero sbarazzarsi di errore effettivo del testo, ma che ignorano la %ERRORLEVEL% che segnala un errore nella mia applicazione. E io legittimamente desidera %ERRORLEVEL% basta che non è il “Nessun file trovato” messaggio di errore.

    Alcuni Esempi:

    Di debug e di eliminare l’errore, in particolare:

    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
    

    Utilizzando un oneliner per tornare ERRORLEVEL il successo o il fallimento:

    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
    

    Utilizzando un oneliner per mantenere il livello di errore a zero per il successo nel contesto di un batchfile in mezzo ad altre codice (ver > nul reimposta il 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
    

    Per un Agente SQL Server CmdExec passaggio di processo sono atterrato sulle seguenti. Non so se è un bug, ma CmdExec all’interno del passo riconosce solo la prima riga di codice:

    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%
    
  15. 4

    Se hai XP resource kit, puoi usare robocopy per spostare tutte le vecchie cartelle in una singola directory, quindi utilizzare rmdir per eliminare solo uno:

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

    Penso e.James risposta è buona visto che funziona con la vecchia versioni di Windows il più presto Windows 2000 SP4 (e forse anche prima), ma è richiesta la scrittura di un file esterno. Qui è una versione modificata che non crea un file di testo esterno, pur mantenendo la compatibilità:

    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)
    

    Per essere vero alla domanda originale, qui è in un script che fa TUTTI i calcoli per voi, se si chiama con il numero di giorni come parametro:

    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)
    

    NOTA: Il codice di cui sopra tiene conto degli anni bisestili, così come l’esatto numero di giorni di ciascun mese. Il solo massimo è il numero totale di giorni ci sono stati dal 0/0/0 (dopo che restituisce anni negativi).

    NOTA: La matematica va solo un modo; non può correttamente il futuro date da ingresso negativo (si cercherà, ma sarà probabilmente andare oltre l’ultimo giorno del mese).

  17. 4

    Gosh, un sacco di risposte già. Un semplice e comodo percorso che ho trovato è stato quello di eseguire ROBOCOPY.EXE due volte in ordine sequenziale da una singola riga di comando di Windows istruzione utilizzando il & parametro.

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

    In questo esempio funziona, selezionando tutti i file (.) che sono più vecchi di 30 giorni e spostarli nella cartella di destinazione. Il secondo comando non fa lo stesso con l’aggiunta di di SPURGO di comando, il che significa rimuovere i file nella cartella di destinazione non esiste nella cartella di origine.
    Quindi, in sostanza, il primo comando SPOSTA i file e il secondo ELIMINA perché non esistono più nella cartella di origine, quando il secondo comando viene invocato.

    Consultare ROBOCOPY documentazione e utilizzare l’opzione /L durante il test.

  18. 3

    Si potrebbe essere in grado di tirare fuori questo. Si può dare un’occhiata a questa domanda, per un semplice esempio. La complessità deriva, quando si inizia a confrontare le date. E ‘ facile dire se la data è maggiore o no, ma ci sono molte situazioni da prendere in considerazione se avete bisogno di ottenere effettivamente la differenza tra due date.

    In altre parole – non provare a inventare questo, a meno che davvero non si può utilizzare strumenti di terze parti.

  19. 3

    questo non è nulla di incredibile, ma avevo bisogno di fare qualcosa di simile a questo di oggi e di eseguirlo come operazione pianificata etc.

    file batch, DelFilesOlderThanNDays.bat sotto con il campione exec w/params:

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

    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
    
  20. 3

    Espansione aku risposta, vedo un sacco di gente che chiede circa i percorsi UNC. Semplicemente inserendo il percorso unc una lettera di unità farà forfiles felice. La mappatura e la unmapping di unità può essere fatto a livello di codice in un file batch, per esempio.

    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"
    

    Questo cancellerà tutti i file con un .estensione gz che sono più vecchi di 7 giorni. Se si desidera assicurarsi Z: non è associato a qualcos’altro prima di usarlo, si potrebbe fare qualcosa di semplice come

    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!"
    )
    
  21. 3

    ROBOCOPY funziona alla grande per me. Originariamente suggerito il mio Iman. Ma invece di spostare i file/cartelle in una cartella temporanea e poi di cancellare il contenuto della cartella temporanea, spostare il file nel cestino!!!

    Si tratta di poche righe di un mio backup di file batch per esempio:

    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
    

    Pulisce niente di età inferiore a 15 giorni dalla mia ‘Temp’ cartella e 30 giorni per niente, nella mia AutoCAD cartella di backup. Io uso le variabili, perché la linea è in grado di ottenere abbastanza a lungo e posso riutilizzare per altre località. Hai solo bisogno di trovare il percorso ms-dos per il cestino è stato associato con il tuo login.

    Questo è su un computer di lavoro per me e funziona. Capisco che alcuni di voi hanno più restrittive dei diritti, ma fare un tentativo comunque;) Ricerca Google per spiegazioni su ROBOCOPY parametri.

    Evviva!

    • Esistente secondo-più-con voto positivo risposta abbraccia anche RoboCopy. Concesso, è possibile utilizzare un po ‘ diverse opzioni, ma è vicino alla risposta.
    • Questo è il post ha un contenuto nuovo–spostare i file nel cestino. Questo non è ancora stato proposto con Robocopy e pienamente risposte il post originale utilizzando un built-in singola riga di comando. Opere di meglio che unire ‘DEL’ e ‘RMDIR’ comandi perché il file può essere restaurato dal cestino. Ehi, io sono ancora qui, dammi una pausa;)
  22. 1

    Questo fatto per me. Funziona con una data e si può sottrarre gli voleva importo in anni di tornare indietro nel tempo:

    @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
    

    il /F in cmd /c del @path /F forze specifico file da eliminare, in alcuni casi, il file può essere di sola lettura.

    il dateYear è l’anno Variabile e non è possibile modificare il sottrarre alle proprie esigenze

  23. 1

    Mio script per eliminare i file più vecchi di un anno specifico :

    @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
    

Lascia un commento