Principale utente con più risposte
Forfiles in batch file

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- Contrassegnato come risposta Maria Atanassova mercoledì 29 aprile 2015 08:16
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 dirittimartedì 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 dirittimartedì 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 dirittimartedì 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 SubDove 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- Contrassegnato come risposta Maria Atanassova mercoledì 29 aprile 2015 08:16
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 dirittimartedì 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
exitAl 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\VideoIl 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 dirittimartedì 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
NextC'è 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 dirittimercoledì 29 aprile 2015 15:40