PDA

View Full Version : [BATCH] Eliminare file più vecchi ti "tot" mesi


nemof
21-11-2008, 14:17
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!

MarcoGG
22-11-2008, 22:34
(anche in altri modi, per carità!)


Nel senso che non è necessario sia un .bat ?
Potrebbe essere un qualsiasi codice funzionante in Windows ?

torettp
22-11-2008, 23:24
non puoi semplicemente visualizzare i detttagli dei file, ordinarli per data di creazione, ed eliminare tutti quelli che ti interessano?

nemof
24-11-2008, 07:15
si si, mi andrebbe bene qualsiasi codice funzionante in win io ho pensato ad un bat, ma sono un profano!:D

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

MarcoGG
24-11-2008, 08:54
si si, mi andrebbe bene qualsiasi codice funzionante in win io ho pensato ad un bat, ma sono un profano!:D


Allora forse meglio qualcosa di più completo/personalizzabile, di uno script .Bat, non trovi ? :)
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 :
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

Permette di scegliere :
- 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 :
Private Sub CommandButton1_Click()

EliminaFiles "D:\PROVA\", "*.*", 90

End Sub

Nell'esempio vengono cancellati tutti i file nella dir D:\PROVA\ più vecchi di 90 giorni (3 mesi).
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... ;)

nemof
24-11-2008, 09:12
...


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?

MarcoGG
24-11-2008, 09:31
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?


Deve funzionare con qualsiasi path di windows valido passato all'argomento stringa "percorso". ;)

nemof
24-11-2008, 13:27
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

MarcoGG
24-11-2008, 17:22
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


Anzitutto, e se per te è lo stesso, la macro lanciala da Excel, che quanto a supporto VBA è l'applicativo migliore di Office.
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 !

nemof
24-11-2008, 20:17
Anzitutto, e se per te è lo stesso, la macro lanciala da Excel, che quanto a supporto VBA è l'applicativo migliore di Office.
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 !

innanzi tutto ti ringrazio moltissimo per la pazienza e la "collaborazione" proverò mercoledi.. domani sono fuori sede, però cosa significa "referenziare la libreria microsoft scriptin runtime?... non pensavo di essere cosi niubbo:mc: .

PS: si la macro ho provato a farla in exel perchè in word non mi dava alcune funzionalità

MarcoGG
25-11-2008, 08:17
però cosa significa "referenziare la libreria microsoft scriptin runtime?... non pensavo di essere cosi niubbo:mc: .


Significa semplicemente, una volta entrati nell'editor VBA, andare al menu :
Strumenti / Riferimenti > Finestra dei rif. disponibili > selezionare Microsoft Scripting Runtime.

nemof
26-11-2008, 13:22
Significa semplicemente, una volta entrati nell'editor VBA, andare al menu :
Strumenti / Riferimenti > Finestra dei rif. disponibili > selezionare Microsoft Scripting Runtime.

wow che emozionoe ci sono riuscito!!! ho provato solo in locale per ora ma sembra funzionare!! GRAZIE MILLEE!!!!

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?

MarcoGG
26-11-2008, 14:00
wow che emozionoe ci sono riuscito!!! ho provato solo in locale per ora ma sembra funzionare!! GRAZIE MILLEE!!!!

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?


Come sarebbe sembra ? :D
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" :

Private Sub Workbook_Open()

'Codice da eseguire all'apertura.
'Metti qui il codice del pulsante...

End Sub

;)

nemof
26-11-2008, 15:08
Come sarebbe sembra ? :D
O funziona o non funziona. Da me perfettamente. Se ci sono problemi posta pure che risolviamo.

;)

eheheh funziona funziona! avevo scritto "sembra" perchè in questi casi non si sa mai... ancora non ci credo...:D :D cmq si in locale funziona.
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 :D )

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!!!!!

MarcoGG
26-11-2008, 17:47
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!!!!!

:cool:
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 ! ;)

nemof
27-11-2008, 14:14
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:D

^TiGeRShArK^
27-11-2008, 18:16
potresti scaricare forfiles se non stai usando windows server 2003 da qui (http://www.codeplex.com/SharedCache/Project/Download/FileDownload.aspx?DownloadId=19171) che devi estrarre sotto c:\windows e quindi puoi eseguire questo nella directory che ti serve:

forfiles /s /d -90 /c "cmd /c del /f /q @FILE"

Occhio però!
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

P.S. dovrebbe cancellare i file anche da tutte le sottodirectory.

MarcoGG
28-11-2008, 11:22
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:D


Beh, semplicemente perchè NON era quello che avevi chiesto. :D
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 ) :

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

Il codice utilizzatore tipico :
EliminaFiles "D:\PROVA\", 90, "doc"

Se vuoi anche eliminare le eventuali subdirectory rimaste vuote bisognerà fare un'altra modifica ( ma hai scritto che non è importante... ).
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. ;)

nemof
28-11-2008, 15:10
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à!!!!!

MarcoGG
30-11-2008, 09:07
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à!!!!!


Beh, ho fatto 30... Faccio 31 ! :D
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 :

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

Codice utilizzatore invariato. ;)

nemof
01-12-2008, 15:18
Grazie per l'aiuto: ho provato a cancellare tutto il vecchio codice e a mettere questo però quando lo lancio non cancella e mi da un errore:

http://img523.imageshack.us/my.php?image=errore1eo3.jpg

e cliccando su degbug invece

http://img523.imageshack.us/img523/8290/errore2md9.jpg

che può essere?
:muro:

MarcoGG
01-12-2008, 17:39
Ahi ! Errore mio. :fagiano:
In effetti il codice utilizzatore adesso è cambiato :

I parametri sono nell'ordine :

percorso As String
numGiorni As Integer
Optional estensioneSenzaPunto As String
Optional dataConfronto As Variant

L'estensione l'ho messa Optional, cosicchè, se omessa il programma interpreta come *.*, mentre se immessa, andrà scritta solo come semplice estensione, e senza punto.

Esempi :

-> Elimina tutti i files + vecchi di 90 giorni da ora :
EliminaFiles "D:\PROVA\", 90

-> Elimina tutti i files del tipo *.doc + vecchi di 90 giorni da ora :
EliminaFiles "D:\PROVA\", 90, "doc"

;)

^TiGeRShArK^
01-12-2008, 18:10
:stordita:
si..
ma a me sembra + uno sparare una formica con una bomba h dato che con un batch si risolveva in una riga di codice per fare esattamente quello che chiedeva... :fagiano:
E per inciso ho perso + tempo a trovare il link per scaricare forfiles per i sistemi che non montano windows 2003 server che a scrivere quella riga di codice...:mbe:

MarcoGG
01-12-2008, 21:25
:stordita:
si..
ma a me sembra + uno sparare una formica con una bomba h dato che con un batch si risolveva in una riga di codice per fare esattamente quello che chiedeva... :fagiano:
E per inciso ho perso + tempo a trovare il link per scaricare forfiles per i sistemi che non montano windows 2003 server che a scrivere quella riga di codice...:mbe:


Bah, non vedo cosa ci sia di male. Lui stesso ha preferito la soluzione VB, mi pare.
Se per lui va bene così, perchè deve usarlo in Windows, meglio che si impari 2 righe di VB, con cui potrà fare ben altro.
Quel codicillo .Bat non è che ci voglia la scienza infusa a trovarlo sul web. :p

^TiGeRShArK^
01-12-2008, 23:46
Bah, non vedo cosa ci sia di male. Lui stesso ha preferito la soluzione VB, mi pare.
Se per lui va bene così, perchè deve usarlo in Windows, meglio che si impari 2 righe di VB, con cui potrà fare ben altro.
Quel codicillo .Bat non è che ci voglia la scienza infusa a trovarlo sul web. :p
io ho trovato solo il link per scaricare forfiles sul web, dato che è presente solo su win 2003, il comando l'ho scritto di persona ;)
Se poi per te è + produttivo scrivere decine e decine di righe in VB piuttosto che risolvere tutto con una sola riga...beh..
contento tu.:boh:
Io ormai ho imparato che è + importante la produttività piuttosto che utilizzare il proprio "linguaggio preferito", e infatti in anni ed anni di programmazione sto cercando di imparare sempre strumenti nuovi, dato che alla fine un linguaggio non dovrebbe essere altro che lo strumento migliore per fare qualcosa.
E in questo caso mi pare innegabile che il batch di windows sia molto + indicato per il problema in questione ;)
EDIT: tra l'altro ho notato che se scrivi il comando che ho postato tra virgolette su google trovi solo un unico risultato: questo thread.
Quindi non mi pare che fosse tanto facile trovarlo in rete prima che io lo scrivessi su questo forum ;)

MarcoGG
02-12-2008, 13:51
Ma sì, nessuno mette in dubbio che la prima richiesta di nemof fosse quella.

Non ci vuole certo un calcolo di "produttività" per pigliare un codice Vba che avevo nel cassetto e dargli una ritoccata, su.

Al .Bat riconosco indubbi vantaggi, primo fra tutti il fatto di poter girare da Dos, secondo la sua (ermetica e criptica) semplicità. Terzo... Basta, mi sa che qui i vantaggi finiscono... :p
Ma forse si può andare davvero lontano anche con un "linguaggio" che ha solo if, for e goto. :D

Il mio "linguaggio preferito" lo avrebbe probabilmente costretto ad installare FW 3.5, mentre era lecito aspettarsi che un utente Win avesse a portata di mano un Office qualunque, e infatti così è stato.
Il mio consiglio, infine, come già detto più sopra, è in vista di possibili future modifiche o aggiunte ( e già nemof ha cambiato idea un paio di volte su ciò che desiderava... ), e credo che, in ambiente Windows, non servano "anni ed anni" di programmazione per affermare la superiorità di VB su un .Bat...

Poi, ognuno la pensa come gli pare. Magari adesso nemof torna e decide di sposare la soluzione .Bat. Pace & Amen...

^TiGeRShArK^
02-12-2008, 13:53
ovviamente dipende da quello che devi fare.
In questo caso mi pare che la superiorità del batch sia innegabile.
In altri casi sarebbe assolutamente inutile.

nemof
03-12-2008, 08:17
grazie infinite
spero di avere tempo oggi di provarlo!!!!!!!!
:D

PS: si in questo caso è indifferente usare uno o l'altro però in generale preferisco VB perchè mi fa tornar ein mente quando (10 anni fa) stavo provandoa impararlo da autodidatta :-)
cmq sarò bacato ma forfiles non sono riuscito a farlo funzionare... mah

MarcoGG
03-12-2008, 11:40
grazie infinite
spero di avere tempo oggi di provarlo!!!!!!!!
:D

PS: si in questo caso è indifferente usare uno o l'altro però in generale preferisco VB perchè mi fa tornar ein mente quando (10 anni fa) stavo provandoa impararlo da autodidatta :-)
cmq sarò bacato ma forfiles non sono riuscito a farlo funzionare... mah

Sono ovviamente d'accordo. VB è una scelta più duttile. ;)

^TiGeRShArK^
03-12-2008, 13:04
grazie infinite
spero di avere tempo oggi di provarlo!!!!!!!!
:D

PS: si in questo caso è indifferente usare uno o l'altro però in generale preferisco VB perchè mi fa tornar ein mente quando (10 anni fa) stavo provandoa impararlo da autodidatta :-)
cmq sarò bacato ma forfiles non sono riuscito a farlo funzionare... mah
...ma l'hai scaricato dal link che ti ho fornito e copiato nella dir di windows? :fagiano:
Con windows server 2003 è già presente, ma mi sa che non è il tuo caso :p

nemof
03-12-2008, 13:05
dunque dunque dunque...:mbe:
ho provato con il nuovo codice e mi ha restituito un errore "ciclo for non inizializzato" (errore 92)

http://img392.imageshack.us/img392/1867/eliminadirrv1.jpg

se nn ho capito male è quando cerca le cartelle vuote da eliminare,
mi sono messo di buona volontà a leggere con calma il codice e a quanto ho tutto sembra coerente e il ciclo for è identico a tutti gli altri, il parametro in ingresso come stringa è corretto, la funzione EliminaDir mi sembra ok (almeno per quanto ne possa capire confrontando con la funzione EliminaFiles) ecc.
non ho ben capito la variabile (it) ma ho visto che viene gia usata sopra allo stesso modo nell'eliminazione dei file e presumo sia corretta...
provo a vedere se riesco a risolvere intanto ho deciso di postare cosi se passi riersco a risolvere prima :D

assie!

MarcoGG
03-12-2008, 13:42
dunque dunque dunque...:mbe:
ho provato con il nuovo codice e mi ha restituito un errore "ciclo for non inizializzato" (errore 92)


Sì è chiaro. Devi innanzitutto controllare che il tuo file Xls contenga SOLO il codice che ti ho suggerito. Se trovi scritte come "Option Explicit" in giro, eliminale !
Inoltre nell'editor VBA vai in Strumenti/Opzioni/Editor/ e controlla che la voce
"Dichiarazione di variabili Obbligatoria" NON sia attiva. Prova ora...
Cmq, quel codice da me ( Excel 2003 ) va perfettamente. ;)

nemof
03-12-2008, 13:54
Sì è chiaro. Devi innanzitutto controllare che il tuo file Xls contenga SOLO il codice che ti ho suggerito. Se trovi scritte come "Option Explicit" in giro, eliminale !
Inoltre nell'editor VBA vai in Strumenti/Opzioni/Editor/ e controlla che la voce
"Dichiarazione di variabili Obbligatoria" NON sia attiva. Prova ora...
Cmq, quel codice da me ( Excel 2003 ) va perfettamente. ;)

ho controllato e non c'è nessuna scrita in più (del resto avevo fatto "copia incolla" dopo aver cancellato tutto) e ho controllato anche di non avere la spunta su quella cartella, dici che a questo punto potrebbe essere la versione? io ho excell 2002 (office xp)

MarcoGG
03-12-2008, 14:09
ho controllato e non c'è nessuna scrita in più (del resto avevo fatto "copia incolla" dopo aver cancellato tutto) e ho controllato anche di non avere la spunta su quella cartella, dici che a questo punto potrebbe essere la versione? io ho excell 2002 (office xp)


Se funzionava tutto il codice precedente su Office Xp, deve funzionare anche questo. Sicuro di non aver "pasticciato" un po' con il codice ?

MarcoGG
03-12-2008, 14:22
A scanso di equivoci ti posto il mio .Xls, che su Excel 2003 funziona ( e secondo me anche su Xp... ). Provalo :

67312

nemof
03-12-2008, 14:26
non credo, ho preso la versione che eliminava perfettamente i soli file vecchi e ho cancellato tutto il modulo e l'ho sostituito con 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


infine in ThisWorkBook ho cancellato tutto (per sicurezza) e sostituito tutto con Private Sub Workbook_Open()

EliminaFiles "c:\PROVA\", 90

End Sub


mah!

nemof
03-12-2008, 14:33
ho provato con il tuo file e mi ha dato lo stesso errore sul ciclo for
non è che devo aggiungere quancora qualcosa in "riferimenti?" io ho selezionato queste opzioni:

http://img183.imageshack.us/img183/3089/iiiooorc8.jpg

:confused: :confused:

MarcoGG
03-12-2008, 14:49
ho provato con il tuo file e mi ha dato lo stesso errore sul ciclo for
non è che devo aggiungere quancora qualcosa in "riferimenti?" io ho selezionato queste opzioni:

http://img183.imageshack.us/img183/3089/iiiooorc8.jpg

:confused: :confused:


No, quei rif vanno bene.
Il codice è corretto sintatticamente, è il solito Office Xp che fa lo stronzo. :rolleyes:

Ad ogni modo il mio file Xls è lì e può essere provato da chiunque.

Ho 3 suggerimenti per ora :
1. Cambia e passa ad Office 2003.
2. Se hai un Visual Studio 6 ti passo il codice VB6 ( .exe e niente più Office )
3. Se proprio, l'exe te lo faccio io, appena ho tempo però...

nemof
03-12-2008, 14:58
3. Se proprio, l'exe te lo faccio io, appena ho tempo però...

no va beh aspetta sei gia stato fin troppo gentile, credimi!! prima provo a vedere se riesco a trovare un pc su cui è montato excel 2003, poi eventualmente ti faccio sapere...

GRAZIE!!!!!

.

nemof
04-12-2008, 07:16
c'è qualcosa che non mi torna: ho provato la tua copia anche su 2 pc su cui è installato office 2003 e entrambi mi hanno dato lo stesso errore sul ciclo for (errore 92)
mah a questo punto resta un mistero!!!

Luca69
04-12-2008, 07:32
Scusate ma solo a me sembra un pazzia usare Office per eseguire uno script?
Io non critico la scelta di scrivere codice in Visual Basic, ma perchè una Macro in Excel !?!?

Lo stesso codice puó essere utilizzato in uno script in VBS (Visual Basic Script)!
Con Windows XP, Windows Script Host dovrebbe essere installata per default ;)

MarcoGG
04-12-2008, 09:58
c'è qualcosa che non mi torna: ho provato la tua copia anche su 2 pc su cui è installato office 2003 e entrambi mi hanno dato lo stesso errore sul ciclo for (errore 92)
mah a questo punto resta un mistero!!!


Ok. Ho modificato i cicli For.
Adesso Xp non dovrebbe più rompere.
Per quanto riguarda Excel 2003 è davvero strano che ti dia quell'errore.
Ti ripeto che l'ultimo foglio che ho postato a me funziona benissimo. :stordita: ( misteri di Office... :D ).

67331

nemof
04-12-2008, 10:29
ora funziona senza piu nessun errore!!!!!
però ho visto che cancella tutte le sottocartelle e i relativi file anche se non sono passati i giorni indicati.
ho creato alcuni file e sottocartelle in data odierna e senza spostare l'orologio ho lanciato la macro.
nella cartella principale non ha eliminato il file creato oggi (giustamente) mentre tutte le sottocartelle (quindi sia quelle vuolte che quelle con i file creati con la data di oggi) sono state eliminate come se non tenesse conto della data nell'eliminazione delle cartelle contenteti file che non dovrebbero essere cancellati :muro: :muro:

MarcoGG
04-12-2008, 11:50
ora funziona senza piu nessun errore!!!!!
però ho visto che cancella tutte le sottocartelle e i relativi file anche se non sono passati i giorni indicati.


Penso di aver fatto troppo in fretta... :fagiano:
Capita, soprattutto sulle consulenze gratuite... :D
Cmq, il mio codice non controlla la data di creazione delle cartelle. Solo quella dei files. Le cartelle vengono eliminate se vuote, quale che sia la loro data di creazione.

Prova adesso :

67335

nemof
04-12-2008, 12:57
Penso di aver fatto troppo in fretta... :fagiano:
Capita, soprattutto sulle consulenze gratuite... :D


ma ci mancherebbe altro!!!:D :D

appena posso lo provo!

assie

nemof
05-12-2008, 07:18
sembra funzionare tutto alla perfezione!!! ora lo testo per bene mettendolo alle corde :D
GRAZIE DI NUOVO!

MarcoGG
05-12-2008, 08:55
sembra funzionare tutto alla perfezione!!! ora lo testo per bene mettendolo alle corde :D
GRAZIE DI NUOVO!


Incrociamo le dita e tratteniamo il respiro... :sperem:

banryu79
05-12-2008, 11:46
Incrociamo le dita e tratteniamo il respiro... :sperem:

Io al tuo posto spiccherei anche una fattura :read: :D

nemof
05-12-2008, 12:36
Incrociamo le dita e tratteniamo il respiro... :sperem:

provato un po'... ma ci sono ancora cose un po' strane... :-) tipo che le sottocartelle (o quantomeno quelle più "interne" vengono eliminate anche se contengono file creati lo stesso giorno.... mi sa che sta diventando proprio un bel casino....

cma non fa nulla dai... non diventare matto... mi ci metterò sotto io con calma nel frattempo userò quello per elimininare solo i file e non le sottocartelle che funziona molto bene

!!!GRAZIE!!! ...

OT
quanto ti devo? :-D
OT

MarcoGG
05-12-2008, 14:04
Io al tuo posto spiccherei anche una fattura :read: :D



:D


provato un po'... ma ci sono ancora cose un po' strane... :-) tipo che le sottocartelle (o quantomeno quelle più "interne" vengono eliminate anche se contengono file creati lo stesso giorno.... mi sa che sta diventando proprio un bel casino....


Io ho provato con diverse nidificazioni, e non noto problemi.
Ma i files che usi per fare il test non sarà che sono vuoti per caso ?
Voglio dire : se crei ad esempio dei file .txt e non ci scrivi niente dentro, avranno dimensione = 0.
In quel caso col mio codice vengono eliminati, perchè la cartella che li contiene avrà dimensione = 0. Del resto che senso ha avere files vuoti ?

nemof
05-12-2008, 14:11
:D



Io ho provato con diverse nidificazioni, e non noto problemi.
Ma i files che usi per fare il test non sarà che sono vuoti per caso ?
Voglio dire : se crei ad esempio dei file .txt e non ci scrivi niente dentro, avranno dimensione = 0.
In quel caso col mio codice vengono eliminati, perchè la cartella che li contiene avrà dimensione = 0. Del resto che senso ha avere files vuoti ?

si i file sono vuoti ma non mi dice che sono di dimensione 0, essendo tuti file di office che quindi hanno una dimensione minima di circa 10 kb anche se sono vuoti....

nemof
05-12-2008, 14:20
in ogni caso sono finalmente riuscito a convincere chi dovrà usare le machine a lavorare in modo leggermente diverso in modo da poter utilizzare la macro per la cancellazione dei soli file quindi sarei anche apposto cosi :D
della serie: se Maometto non va alla montagna...

MarcoGG
06-12-2008, 08:21
in ogni caso sono finalmente riuscito a convincere chi dovrà usare le machine a lavorare in modo leggermente diverso in modo da poter utilizzare la macro per la cancellazione dei soli file quindi sarei anche apposto cosi :D
della serie: se Maometto non va alla montagna...


No, non ci sto. :D
DEVE funzionare. L'ho riscritto da zero, e mi sono accorto di un paio di punti in cui il codice può produrre errori... :

67386

nemof
07-12-2008, 21:45
No, non ci sto. :D
DEVE funzionare. L'ho riscritto da zero, e mi sono accorto di un paio di punti in cui il codice può produrre errori... :

67386

azz noooo non era necessario tutto sto lavoro!!!! anche se capisco che in questi casi diventa più una "questone personale" che altro
non mi resta che ringraziarti, martedi lo provo, però mi spiace che ti sei rimesso a scriverlo da capo!!!

nemof
09-12-2008, 13:06
wow ho fatto tutti i test possibili e anche quelli immaginabili... e sembra funzionare tutto perfettamente, geniale poi il report delle operazioni fatte cosi se qualcosa non va ci si accorge subito, fantastico!

GRAZIEEEEEEE

:D

MarcoGG
09-12-2008, 17:26
wow ho fatto tutti i test possibili e anche quelli immaginabili... e sembra funzionare tutto perfettamente, geniale poi il report delle operazioni fatte cosi se qualcosa non va ci si accorge subito, fantastico!

GRAZIEEEEEEE

:D

:cool:
Sì, in effetti il codice precedente era il risultato di un po' di modifiche affrettate, che non mi piacevano, ed era venuta fuori una soluzione "frankenstein".
Le liste ovviamente aiutano molto in debug, e dimostrano quanto possa essere tutto più user-friendly per chi lo deve usare, molto più di un .bat o .vbs che sia...