locked
Forfiles in batch file RRS feed

  • Domanda

  • Innanzitutto un saluti a tutti voi.
    Premesso che ho poca dimestichezza con l'utilizzo di comandi batch, sebbene mi stia cimentando a realizzare uno script che mi elimini determinate cartelle, compreso tutto il loro contenuto in sottocartelle e files. Il requisito fondamentale affinchè lo script cancelli la cartella madre ed il suo contenuto deve  essere la sua data di creazione e non la data ultima modifica. Questo è il comando che ho tirato su:

    call forfiles /P C:\BACKUP /D -30 /C "cmd /C if @isdir==TRUE rmdir /Q /S @path & echo @path --- Data e ora creazione: @fdate , @ftime -- Data e ora cancellazione: %date% , %time% >> W:\CancellaDati.log

    Nonostante ciò, il comando non cancella alcunché e questo perché l'opzione /D -30 tiene in considerazione la data di "Ultima modifica" della cartella e non la "Data di Creazione", quella di cui realmente necessito. Infatti, la data "Ultima Modifica" può essere anche oggi mentre la data di Creazione della cartella può risalire anche a 2 anni fa. Esiste un qualche metodo con cui io possa intercettare la data di creazione della cartella madre? Spero che qualcuno possa aiutarmi.
    Vi ringrazio fin d'ora per il vostro interessamento e/o contributo e a presto!

    martedì 28 aprile 2015 14:53

Risposte

  • Te lo ho adattato, un po' in fretta, non testato.

    • Salvalo con in nome che ti pare ed estensione .vbs
    • Diciamo che lo hai salvato come DelOldF.vbs , da un cmd prompt elevato esegui:

    cscript DelOldF.vbs \\?\c:\temp 30 >> logfile.txt

    dove \\?\c:\temp é la cartella da cui vuoi partire (il prefisso \\?\ serve per cancellare nomi over 255 char)

      30 sono i giorni di anzianitá (se oggi meno la data di creazione é superiore la cartella viene cancellata)

    Lo script manda in output le cartelle che cancella, per questo ti ho indicato di redirigere su un file di testo.

    Fammi sapere se funziona che cosí magari lo miglioro e lo metto sul web che sta cosa dei 255 caratteri pare essere un problema diffuso.

    Set objArgs = Wscript.Arguments
    RootDir=objArgs(0)
    Days=objArgs(1)
    DeleteOldFolders RootDir,Days
    
    Sub DeleteOldFolders(root, maxAgeInDays)
      Dim fso, folder
      Set fso = CreateObject("Scripting.FileSystemObject")
      If fso.FolderExists(root) Then
        For Each folder in fso.GetFolder(root).SubFolders
    	dd=cint(DateDiff("d", folder.DateCreated, Date))
        if (dd > cint(maxAgeInDays)) Then
            wscript.echo "Cancello " & folder
    		folder.Delete True
          End If
        Next
      else
    	wscript.echo folder & " non esiste"
      End If
      Set fso = Nothing
    End Sub


    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    martedì 28 aprile 2015 17:59

Tutte le risposte

  • immagino che powershell non sia un opzione...

    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    martedì 28 aprile 2015 15:22
  • ho trovato un vbs...

    http://stackoverflow.com/questions/15072155/delete-folders-older-than-certain-age


    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    martedì 28 aprile 2015 15:24
  • Grazie per la risposta. Ho provato anche con powershell, ma lo conosco ancor meno del batch.
    In ogni modo ho provato con questo codice: 

    dir “C:\Backup” –recurse | where { ((get-date)-$_.creationTime).days -gt 30 } | remove-item –force -recurse

    ma ho trovato difficoltà poiché non mi rimuove la cartella madre visto che in essa rimangono diramazioni di sottocartelle anche vuote e altre sottocartelle contenenti file il cui path supera abbondantemente i 255 caratteri e per tale ragione lo script va in errore.

    martedì 28 aprile 2015 15:50
  • Il vbs lo hai provato?

    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    martedì 28 aprile 2015 16:13
  • Ho provato ma non  fa nulla, nel senso che probabilmente non riesco ad adattarlo al mio caso. Praticamente questo è il codice:

    Sub DeleteOldFolders(root, maxAgeInDays)
      Dim fso, folder

      Set fso = CreateObject("Scripting.FileSystemObject")

      If fso.FolderExists(root) Then
        For Each folder in fso.GetFolder(root).SubFolders
          If DateDiff("d", folder.DateCreated, Date) > maxAgeInDays Then
            folder.Delete True
          End If
        Next
      End If

      Set fso = Nothing
    End Sub

    Dove inserisco la cartella che lo script deve controllare? E soprattutto cosa devo cambiare affinché vada a verificarmi la data di creazione della cartella? Tu puoi aiutarmi perché il VBS non lo conosco affatto.

    Grazie

    martedì 28 aprile 2015 16:43
  • Te lo ho adattato, un po' in fretta, non testato.

    • Salvalo con in nome che ti pare ed estensione .vbs
    • Diciamo che lo hai salvato come DelOldF.vbs , da un cmd prompt elevato esegui:

    cscript DelOldF.vbs \\?\c:\temp 30 >> logfile.txt

    dove \\?\c:\temp é la cartella da cui vuoi partire (il prefisso \\?\ serve per cancellare nomi over 255 char)

      30 sono i giorni di anzianitá (se oggi meno la data di creazione é superiore la cartella viene cancellata)

    Lo script manda in output le cartelle che cancella, per questo ti ho indicato di redirigere su un file di testo.

    Fammi sapere se funziona che cosí magari lo miglioro e lo metto sul web che sta cosa dei 255 caratteri pare essere un problema diffuso.

    Set objArgs = Wscript.Arguments
    RootDir=objArgs(0)
    Days=objArgs(1)
    DeleteOldFolders RootDir,Days
    
    Sub DeleteOldFolders(root, maxAgeInDays)
      Dim fso, folder
      Set fso = CreateObject("Scripting.FileSystemObject")
      If fso.FolderExists(root) Then
        For Each folder in fso.GetFolder(root).SubFolders
    	dd=cint(DateDiff("d", folder.DateCreated, Date))
        if (dd > cint(maxAgeInDays)) Then
            wscript.echo "Cancello " & folder
    		folder.Delete True
          End If
        Next
      else
    	wscript.echo folder & " non esiste"
      End If
      Set fso = Nothing
    End Sub


    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    martedì 28 aprile 2015 17:59
  • Ottimo! Funziona egregiamente! Solo una cosa, il log file mi restituisce ciò:

    Cancello \\?\w:\BCK_Day\Audio

    Ho scritto male qualcosa?

    Grazie

    martedì 28 aprile 2015 18:26
  • se hai fatto la redirezione con un singolo '>' hai solo l'ultima riga se invece nei hai messi due  '>>' dovresti avere la lista dei file cancellati

    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    martedì 28 aprile 2015 18:44
  • Il comando l'ho inserito in un file bat cosicché io possa farlo lanciare in automatico, pianificandomi un'attività ed è questo:

    @echo off
    cscript DelOldF.vbs \\?\W:\BCK_Day 20 > W:\DelOldF.log
    exit

    Al termine il file di log mi restituisce soltanto la lista delle cartelle che sono state cancellate e non i files eventualmente contenuti, questo è il risultato:

    Microsoft (R) Windows Script Host Versione 5.8
    Copyright (C) Microsoft Corporation 1996-2001. Tutti i diritti riservati.

    Cancello \\?\w:\BCK_Day\Vari
    Cancello \\?\w:\BCK_Day\Video

    Il codice mi va bene anche così ma se non disturbo, vorrei poterlo implementare anche con la cancellazione dei files contenuti dentro la directory madre W:\BCK_Day, poiché questo non lo fa, sempre avendo la possibilità di listare nel file di log, tutti i files e le sottocartelle cancellate. Per me sarebbe l'optimum, ma se non è possibile va bene anche così.

    Grazie tante per il tuo prezioso aiuto.

    martedì 28 aprile 2015 19:11
  • Non ci sono i files perché non lo avevi specificato, mi dispiace ma per il momento non ho tempo di modificarlo ulteriormente,

    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    martedì 28 aprile 2015 19:16
  • Buongiorno, ok attenderò semmai deciderai di modificarlo.

    Grazie per ora!

    mercoledì 29 aprile 2015 06:38
  • Salve, sono riuscito ad integrare questo codice funzionante, che ho trovato sul web, e lo uso per cancellare i file contenuti nella cartella radice "BCK_Day":

    Set fso = Nothing
    Set fso = CreateObject("Scripting.FileSystemObject")
    'Punta alla cartella da analizzare.
    Set folder = fso.GetFolder("W:\BCK_Day")
    'Crea una collezione dei files contenuti nella cartella.
    Set files = folder.Files
    For Each file in files
        'Se la differenza tra la data di oggi e la
        'data di ultima modifica del file è maggiore di 30 giorni...
        If DateDiff("d", file.DateCreated, Now) > 20 Then
            'allora cancella il file.
            file.Delete
            'oppure spostalo in una cartella di archivio.
            'file.Move "C:\MesiPrecedenti\"
        End If
    Next

    C'è solo un problema: ora devo listare, in un file di log, tutti i files e cartelle cancellate e se possibile comprese di data e ora di cancellazione. Ovviamente per far ciò ho bisogno del tuo/vostro prezioso aiuto!

    Grazie ancora

    mercoledì 29 aprile 2015 14:26
  • ti posso solo dare alcune dritte:

    wscript.echo stringa  -> manda una stringa in output

    file.name -> e' il nome del file nel tuo esempio (nota file.delete)

    date -> ritorna la data di sistema 

    time -> ritorna l'ora di sistema

    & -> concatena le stringhe

    es:

    wscript.echo date & " " & time &" Cancello " & file.name

    prima di file.delete

    poi occhio che li hai 20 gg non 30 come dice il commento


    This post is provided AS IS with no warranties or guarantees, and confers no rights.
    ~~~
    Questo post non fornisce garanzie e non conferisce diritti

    mercoledì 29 aprile 2015 15:40