|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
[BATCH] Eliminare file più vecchi ti "tot" mesi
ragazzi avrei bisogno di un piccolo aiutino se possibile, sto cercando un modo per eliminare in automatico tutti i file più vecchi di 3 mesi da una cartella lanciando un'applicazione di batch. sono 2 giorni che cerco su internet ho trovato qualche soluzione, ovvero una riga di comando (che sfruttava il comando forfiles) però non sapendo programmare sono andato quasi per tentativi ma ne ho ricavato solo un gran mal di testa!!! mi chiedevo se qualcuno di voi ha idea di come poter fare una cosa del genere (anche in altri modi, per carità!) io non so più dove sbattere la testa e ve ne sarei molto grato!
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Banzi (Pz)
Messaggi: 657
|
non puoi semplicemente visualizzare i detttagli dei file, ordinarli per data di creazione, ed eliminare tutti quelli che ti interessano?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
si si, mi andrebbe bene qualsiasi codice funzionante in win io ho pensato ad un bat, ma sono un profano!
sul fatto di farlo manualmente visualizzando la data lo escluderei perchè la persona che deve lavorare su quella macchina lo farebbe solo il primo giorno e poi basta. (è molto disordinata ecc). e poi tenere il conto dei mesi in questo modo potrebbe portare ad errori prima o poi
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Se hai Office installato suggerisco qualcosa di simile a questo, che può girare come Macro, anche solo da un .doc Word con un solo pulsante. Nessun bisogno di compilare in .exe quindi : -> Codice da mettere in un Modulo VBA : Codice:
Public Sub EliminaFile(nomeCompFile As String)
If Len(Dir$(nomeCompFile)) > 0 Then
'aggiungere eventuale gestione attributi file...
On Error Resume Next
SetAttr nomeCompFile, vbNormal
Kill nomeCompFile
End If
End Sub
Public Sub EliminaFiles(percorso As String, filtro As String, numGiorni As Integer, Optional dataConfronto As Variant)
'Richiede Reference alla library : Microsoft Scripting Runtime.
'Se omesso dataConfronto, la Sub utilizza di default la data di sistema corrente (now).
Dim FSO As New FileSystemObject
Dim F As File
Dim nomiFile() As String
Dim cnt As Long
cnt = 0
Dim nomeFile As Variant
Dim DDiff As Long
Dim dataCr As Date
Dim dataConf As Date
If IsMissing(dataConfronto) Then
dataConf = Now
ElseIf Not IsDate(dataConfronto) Then
Exit Sub
Else
dataConf = CDate(Format(dataConfronto, "mm/dd/yyyy"))
End If
nomeFile = Dir$(percorso & filtro)
Do While nomeFile <> ""
ReDim Preserve nomiFile(cnt)
nomiFile(cnt) = nomeFile
nomeFile = Dir$
cnt = cnt + 1
Loop
For Each nomeFile In nomiFile
Set F = FSO.GetFile(percorso & nomeFile)
dataCr = F.DateCreated
DDiff = DateDiff("d", dataCr, dataConf)
If DDiff >= numGiorni Then
EliminaFile percorso & nomeFile
End If
Next
Set F = Nothing
Set FSO = Nothing
End Sub
- il percorso - il filtro, ossia il tipo file : "*.*", "*.doc" ecc... - numero giorni trascorsi - data iniziale di confronto Permette inoltre di impostare via codice, nella "Sub EliminaFile" gli attributi di quei files che potrebbero "opporsi" alla cancellazione... -> E questo è il codice del pulsante che lo lancia : Codice:
Private Sub CommandButton1_Click()
EliminaFiles "D:\PROVA\", "*.*", 90
End Sub
Ho usato questo perchè deriva da un codice fatto da me tempo fa in cui il conto veniva fatto sui giorni. Ovviamente, se decidi di adottarlo, può essere modificato in modo da fare il conto sui mesi... Prova... |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
WOW fantastico!!!! appena ho un attimo di "tregua" sul lavoro me lo studio per bene e faccio qualche prova!!! (al limite chiedo qualcosina)
DAVVERO GRAZIE MILLE!!!!! ps: funziona anche se il disco è un disco di rete (è un NAS) giusto?
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
ho provato a creare la macro ecc, quello che non capisco però è dove mettere il codice del pulsante, perchè quando creo un pulsante a cui assegno la macro vedo l'icona ma non riesco a inserire la riga di comando che mi permette di scegliere la cartella, il tipo di file ecc
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Poi, il pulsante va inserito dal menu Visualizza/Barre degli Strumenti/Strumenti di Controllo -> scegli il "Command Button", o "Pulsante di Comando". Appena aggiunto il pulsante, Excel ( o Word ecc... ) entra in modalità progettazione. Doppio Click sul pulsante e sei nell'editor ! P.S.: non dimenticare di referenziare la libreria Microsoft Scripting Runtime ! |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
Quote:
PS: si la macro ho provato a farla in exel perchè in word non mi dava alcune funzionalità
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Strumenti / Riferimenti > Finestra dei rif. disponibili > selezionare Microsoft Scripting Runtime. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
Quote:
PS: un'ultimissima cosa: avendo la necessità di lanciare in automatico l'appllicazione (tramite operazioni pianificate) come potrei fare in modo che aprendo il file la macro si esegua senza dover cliccare sul pulsante?
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
O funziona o non funziona. Da me perfettamente. Se ci sono problemi posta pure che risolviamo. Per lanciare la Macro in auto all'apertura, prima devi settare BASSO a Strumenti/Macro/Protezione. Poi ti porti nell'editor Vba, in corrispondenza dell'oggetto "ThisWorkbook" : Codice:
Private Sub Workbook_Open()
'Codice da eseguire all'apertura.
'Metti qui il codice del pulsante...
End Sub
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
Quote:
appena possibile proverò a mettere il codice per farlo partire in autormatico e metto come cartella di destinazione quella della rete (se metto le mani sulla rete adesso vengo linciato da quelli che ci stanno lavorando in produzione PS: ho provato a lanciarlo da "calc" di openoffice 3 ma non sono riosucito a farlo funzionare, riconosce la macro (infatti avevo abbassato la protezione) ma non esegue il comando, serve proprio la suite microsoft? va beh, cmq questi sono solo dettagli, l'importate è essere riscuito a far funzionare il tutto!!! GRAZIE ANCORA PER IL CODICE, LA GENTILEZZA E PER TUTTO L'AIUTO!!!!!
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono Ultima modifica di nemof : 26-11-2008 alle 16:17. |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
No, con Open Office ci sono pesanti differenze nello scripting e nel modello a oggetti. Copia/Incollare VBA non serve a nulla. Il mio consiglio è di lasciar perdere Calc e usare Ms Excel, che è ottimo ! |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
no problema userò office!
però ho un dubbio: ho fatto alcune prove e vedo che non vengono cancellati ne' le sottocartelle nè (cosa che miinteresserebbe di più) i file contenuti al loro interno. ho provato ad aggirare il problema ripetendo la riga di comandi per diverse cartelle in Thisworkbook ma non c'è stato niente da fare. se volessi fare una cosa del genere dovrei perforza creare tanti file .xls quante sono le cartella da "trattare"? non so se mi sono..capito
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
potresti scaricare forfiles se non stai usando windows server 2003 da qui che devi estrarre sotto c:\windows e quindi puoi eseguire questo nella directory che ti serve:
Codice:
forfiles /s /d -90 /c "cmd /c del /f /q @FILE" Prima provalo su una copia della directory che ti serve e controlla bene che tutto vada a buon fine prima di provarlo sulla directory reale così sei sicuro che cancelli solo i file che devi cancellare P.S. dovrebbe cancellare i file anche da tutte le sottodirectory.
__________________
Ultima modifica di ^TiGeRShArK^ : 27-11-2008 alle 19:18. |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Se vuoi eliminare tutti i files di tutte le subdirectory che soddisfano i criteri, metti tutto questo codice in un modulo ( ed elimina tutto il vecchio codice ) : Codice:
Public arrayFiles() As String
Public cnt As Long
Public Sub EliminaFile(nomeCompFile As String)
If Len(Dir$(nomeCompFile)) > 0 Then
'aggiungere eventuale gestione attributi file...
On Error Resume Next
SetAttr nomeCompFile, vbNormal
Kill nomeCompFile
End If
End Sub
Public Sub EliminaFiles(percorso As String, numGiorni As Integer, Optional estensioneSenzaPunto As String, Optional dataConfronto As Variant)
cnt = 0
Dim ext As String
If IsMissing(estensioneSenzaPunto) Then
ext = "*"
Else
ext = estensioneSenzaPunto
End If
Dim DDiff As Long
Dim dataCr As Date
Dim dataConf As Date
If IsMissing(dataConfronto) Then
dataConf = Now
ElseIf Not IsDate(dataConfronto) Then
Exit Sub
Else
dataConf = CDate(Format(dataConfronto, "mm/dd/yyyy"))
End If
Dim FD As Folder
Dim FSO As Object
Dim FLS As Object
Set FSO = New Scripting.FileSystemObject
Set FD = FSO.GetFolder(percorso)
Set FLS = FD.Files
Dim F As File
For Each F In FLS
ReDim Preserve arrayFiles(cnt)
arrayFiles(cnt) = FD.Path & "\" & F.Name
cnt = cnt + 1
Next
sottoCartelle FSO.GetFolder(percorso)
Dim ok As Boolean
Dim it As Variant
For Each it In arrayFiles
ok = True
Set F = FSO.GetFile(it)
'Condizione 1 Data Creazione :
dataCr = F.DateCreated
DDiff = DateDiff("d", dataCr, dataConf)
If DDiff < numGiorni Then
ok = False
End If
'Condizione 2 Estensione :
If ext <> "*" Then
If FSO.GetExtensionName(F.Name) <> ext Then
ok = False
End If
End If
'Condizione N :
'...
If ok = True Then
EliminaFile (it)
End If
Next
End Sub
Public Sub sottoCartelle(CartellaPrinc As Folder)
Dim FD As Folder
Dim SFD As Folder
Dim FSO As Object
Dim FLS As Object
Set FSO = New Scripting.FileSystemObject
For Each SFD In CartellaPrinc.SubFolders
Set FD = FSO.GetFolder(SFD.Path)
Set FLS = FD.Files
Dim F As File
For Each F In FLS
ReDim Preserve arrayFiles(cnt)
arrayFiles(cnt) = FD.Path & "\" & F.Name
cnt = cnt + 1
Next
sottoCartelle SFD
Next
End Sub
Codice:
EliminaFiles "D:\PROVA\", 90, "doc" La parte in rosso, per sottolineare la semplicità con cui si possono inserire nuove condizioni da soddisfare... Lascio a te decidere se l'ermeticità di uno script .Bat sia meglio o no, soprattutto in vista di ulteriori modfiche o implementazioni... Prova. |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Feb 2006
Città: bergamo
Messaggi: 603
|
preferisco non addentrarmi nel bat ma rimanere in una macro va più che bene. lo so che non avevo chiesto quello però facendo girare il programma mi sono accorto che sarebbe stato meglio meglio cancellare anche i file delle sottocartelle. grazie di nuovo!!!
PS: non è fondamentale cmq mi farebbe molto comodo oltre che i file eliminare anche le sotocartelle in modo da avere tutto pulito, però non vorrei rompere troppo le balle! se non è troppo uno sbattimento potresti dirmi anche quella modifica? però ripeto: solo se non rompo troppo le balle, mi hai gia aiutato moltissimo e non vorrei abusare della disponibilità!!!!!
__________________
al mondo esistono 10 categorie di persone: quelle che conoscono il codice binario e quelle che nn lo conoscono |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Questa versione fa proprio tutto : cancellazione files in dir e subdir ed eventuale eliminazione delle dir vuote. Sempre da testare con cautela. Sostituisci tutto quanto con : Codice:
Public arrayFiles() As String
Public arrayDirs() As String
Public cnt As Long
Public Sub EliminaFile(nomeCompFile As String)
On Error Resume Next
'aggiungere eventuale gestione attributi file...
SetAttr nomeCompFile, vbNormal
Dim FSO As New Scripting.FileSystemObject
FSO.DeleteFile nomeCompFile
Set FSO = Nothing
End Sub
Public Sub EliminaDir(nomeCompDir As String)
On Error Resume Next
'aggiungere eventuale gestione attributi cartella...
SetAttr nomeCompDir, vbNormal
Dim FSO As New Scripting.FileSystemObject
FSO.DeleteFolder nomeCompDir
Set FSO = Nothing
End Sub
Public Sub EliminaFiles(percorso As String, numGiorni As Integer, Optional estensioneSenzaPunto As String, Optional dataConfronto As Variant)
cnt = 0
Dim ext As String
If IsMissing(estensioneSenzaPunto) Then
ext = "*"
Else
ext = estensioneSenzaPunto
End If
Dim DDiff As Long
Dim dataCr As Date
Dim dataConf As Date
If IsMissing(dataConfronto) Then
dataConf = Now
ElseIf Not IsDate(dataConfronto) Then
Exit Sub
Else
dataConf = CDate(Format(dataConfronto, "mm/dd/yyyy"))
End If
Dim FSO As New Scripting.FileSystemObject
Dim FD As Folder
Set FD = FSO.GetFolder(percorso)
Dim FLS As Files
Set FLS = FD.Files
Dim F As File
For Each F In FLS
ReDim Preserve arrayFiles(cnt)
arrayFiles(cnt) = FD.Path & "\" & F.Name
cnt = cnt + 1
Next
sottoCartelleFiles FSO.GetFolder(percorso)
Dim ok As Boolean
Dim it As Variant
For Each it In arrayFiles
ok = True
Set F = FSO.GetFile(it)
'Condizione 1 Data Creazione :
dataCr = F.DateCreated
DDiff = DateDiff("d", dataCr, dataConf)
If DDiff < numGiorni Then
ok = False
End If
'Condizione 2 Estensione :
If ext <> "*" Then
If FSO.GetExtensionName(F.Name) <> ext Then
ok = False
End If
End If
'Condizione N :
'...
If ok = True Then
EliminaFile (it)
End If
Next
Set F = Nothing
Set FLS = Nothing
Set FD = Nothing
Set FSO = Nothing
'Controlla ed elimina cartelle vuote :
cnt = 0
sottoCartelleVuote percorso
For Each it In arrayDirs
EliminaDir (it)
Next
End Sub
Public Sub sottoCartelleFiles(CartellaPrinc As Folder)
Dim FSO As New Scripting.FileSystemObject
Dim FD As Folder
Dim SFD As Folder
Dim FLS As Object
For Each SFD In CartellaPrinc.SubFolders
Set FD = FSO.GetFolder(SFD.Path)
Set FLS = FD.Files
Dim F As File
For Each F In FLS
ReDim Preserve arrayFiles(cnt)
arrayFiles(cnt) = FD.Path & "\" & F.Name
cnt = cnt + 1
Next
sottoCartelleFiles SFD
Set FD = Nothing
Set FLS = Nothing
Next
Set FSO = Nothing
End Sub
Public Sub sottoCartelleVuote(CartellaPrinc As String)
Dim FSO As New Scripting.FileSystemObject
Dim FD As Folder
Dim FDS As Folders
Dim dimFD As Long
Set FD = FSO.GetFolder(CartellaPrinc)
dimFD = FD.Size
If dimFD = 0 Then
ReDim Preserve arrayDirs(cnt)
arrayDirs(cnt) = FD.Path
cnt = cnt + 1
Else
Set FDS = FD.SubFolders
For Each FD In FDS
sottoCartelleVuote FD.Path
Next
Set FDS = Nothing
End If
Set FD = Nothing
Set FSO = Nothing
End Sub
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:23.



















