Principale utente con più risposte
File batch che lancia file vbscript per cancellare tutti i files e cartelle contenute in uno specifico path

Domanda
-
Buongiorno a tutti. Con il vostro prezioso aiuto sono riuscito a realizzare un programmino che cancella le cartelle e sottocartelle, compresi i files in esse contenuti, presenti in uno specifico path e più vecchi di 30 giorni a partire dalla data odierna (come data di riferimento deve necessariamente tenere conto della data di creazione della cartella stessa). Il programmino è un batch file che contiene questo codice:
@ECHO OFF
cscript CancellaDati.vbs \\?\G:\BCK_Day 30 (non so a cosa serva il 30, visto che è presente nel codice vbscript)
exit- Mentre il file vbscript contiene questo codice:
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
folder.Delete True
End If
Next
End If
Set fso = Nothing
Set fso = CreateObject("Scripting.FileSystemObject")
'Punta alla cartella da analizzare.
Set folder = fso.GetFolder("G:\BCK_Day")
Set files = folder.Files
For Each file in files
'Se la differenza tra la data di oggi e la data di creazione del file è maggiore di 30 giorni
If DateDiff("d", file.DateCreated, Now) > 30 Then
file.Delete
End If
Next
End SubTutto sommato il programmino funziona e, sempre grazie al vostro aiuto, siamo riusciti a gestire anche l’errore derivante dalla cancellazione dei files il cui path supera i 255 caratteri. Però il programma di tanto in tanto si blocca con un errore di runtime per il quale non riesce a completare la cancellazione delle cartelle e dei files. Mi sembra di aver capito che a causare l’errore di runtime, e quindi il blocco del programma, sia il fatto che esso non riesce a cancellare i files di sola lettura, interrompendo tutta la fase di cancellazione.
Gentilmente, vi chiedo se è possibile far sì che il programmino mi cancelli tutto ma proprio tutto compreso i files, cartelle e sottocartelle di sola lettura, senza che per nessun altro motivo si blocchi?
Attendo fiducioso un vostro immancabile consiglio, per il momento ringrazio tutti e vi auguro una buona giornata.Luigi
giovedì 4 giugno 2015 07:14
Risposte
-
Ciao,
per il fatto dei 30 giorni come parametro é sufficiente cambiare il numero 30 con "Days" senza virgolette ovviamente.
Per il resto potresti anche avere problemi di permessi oltre che di files readonly.
aggiungi questo in testa allo script
Const ReadOnly = 1
E questo prima di cancellare il file:
If File.Attributes AND ReadOnly Then File.Attributes = File.Attributes XOR ReadOnly End If
This post is provided AS IS with no warranties or guarantees, and confers no rights.
~~~
Questo post non fornisce garanzie e non conferisce diritti- Proposto come risposta Maria Atanassova venerdì 5 giugno 2015 07:39
- Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:13
giovedì 4 giugno 2015 07:31 -
Luigi, qui non si tratta di "ricorrere a codice" ma di fare qualche ricerca prima di chiedere "come si fa".
Questo dovrebbe risolverti http://www.computerhope.com/issues/ch000932.htm
This post is provided AS IS with no warranties or guarantees, and confers no rights.
~~~
Questo post non fornisce garanzie e non conferisce dirittivenerdì 5 giugno 2015 07:42 -
...
non so come fare per far sì che il programmino si avvii con la finestra ridotta a icona. In realtà ho provato creando un collegamento del file batch e nelle proprietà del collegamento c'è anche la possibilità di avviarlo ridotto a icona....
Banalmente potresti pianificare direttamente wscript.exe e tuo script vbs + parametri (ancora più semplice cambi cscript con wscript nel batch ...)
WSCRIPT.exe CancellaDati.vbs \\?\G:\BCK_Day 30
Solitamente si usa cscript se si vuole una esecuzione sincrona e l'output a console o reindirizzato in file per logging o debug (poi io ragionerei se mettere un Wscript o Cscript con //nologo //b se non vuoi nessun feedback es cscript //nologo CancellaDati.vbs \\?\G:\BCK_Day )
oppure via codice vbscript crei un processo hidden
http://superuser.com/questions/62525/run-a-batch-file-in-a-completely-hidden-way
Gastone Canali >http://www.armadillo.it
Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere
- Modificato GastoneCanali venerdì 5 giugno 2015 11:08
- Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:13
venerdì 5 giugno 2015 10:54 -
Mi sembra di si
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 lugimato mercoledì 10 giugno 2015 07:13
giovedì 4 giugno 2015 12:24
Tutte le risposte
-
Ciao,
per il fatto dei 30 giorni come parametro é sufficiente cambiare il numero 30 con "Days" senza virgolette ovviamente.
Per il resto potresti anche avere problemi di permessi oltre che di files readonly.
aggiungi questo in testa allo script
Const ReadOnly = 1
E questo prima di cancellare il file:
If File.Attributes AND ReadOnly Then File.Attributes = File.Attributes XOR ReadOnly End If
This post is provided AS IS with no warranties or guarantees, and confers no rights.
~~~
Questo post non fornisce garanzie e non conferisce diritti- Proposto come risposta Maria Atanassova venerdì 5 giugno 2015 07:39
- Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:13
giovedì 4 giugno 2015 07:31 -
Grazie per la risposta. Allora se non ho capito male il file batch dovrebbe essere così:
@ECHO OFF
cscript CancellaDati.vbs \\?\G:\BCK_Day Days
exitMentre il file VBScript. così:
Const ReadOnly = 1
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
folder.Delete True
End If
Next
End If
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
If DateDiff("d", file.DateCreated, Now) > 30 Then
If File.Attributes AND ReadOnly Then
File.Attributes = File.Attributes XOR ReadOnly
End If
file.Delete
End If
Next
End SubSpero sia corretto.
giovedì 4 giugno 2015 12:12 -
Mi sembra di si
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 lugimato mercoledì 10 giugno 2015 07:13
giovedì 4 giugno 2015 12:24 -
Ok, ho aggiornato il codice su entrambi i file ed ho ricreato l'utilità di pianificazione su una macchina sulla quale dovranno essere cancellati i files e le cartelle di backup. Lo schedule verrà eseguito tutti i giorni alle ore 23:00 ed il primo partirà proprio questa sera perciò solo domani saprò se lo script avrà cancellato i files.
Per il momento ancora grazie per il supporto e a risentirci per eventuali feedback.
Luigigiovedì 4 giugno 2015 13:38 -
Innanzitutto buona giornata a tutti. Tanto per essere coerenti, il programmino funziona perfettamente! Ho solo un'ultima richiesta da fare: non so come fare per far sì che il programmino si avvii con la finestra ridotta a icona. In realtà ho provato creando un collegamento del file batch e nelle proprietà del collegamento c'è anche la possibilità di avviarlo ridotto a icona. Però questa soluzione non è consona per il mio caso, poiché devo necessariamente avviare il tutto con l’ “Utilità di Pianificazione” la quale fra le sue proprietà non prevede l’avvio di programmi da collegamenti degli stessi. Quindi devo ricorrere a codice ma non saprei da dove cominciare e soprattutto dove inserirlo, se nel file Batch quando richiamo il file vbscript oppure in quello vbscript. Attendo eventuali consiglio.
Grazie, Luigi
venerdì 5 giugno 2015 07:27 -
Luigi, qui non si tratta di "ricorrere a codice" ma di fare qualche ricerca prima di chiedere "come si fa".
Questo dovrebbe risolverti http://www.computerhope.com/issues/ch000932.htm
This post is provided AS IS with no warranties or guarantees, and confers no rights.
~~~
Questo post non fornisce garanzie e non conferisce dirittivenerdì 5 giugno 2015 07:42 -
...
non so come fare per far sì che il programmino si avvii con la finestra ridotta a icona. In realtà ho provato creando un collegamento del file batch e nelle proprietà del collegamento c'è anche la possibilità di avviarlo ridotto a icona....
Banalmente potresti pianificare direttamente wscript.exe e tuo script vbs + parametri (ancora più semplice cambi cscript con wscript nel batch ...)
WSCRIPT.exe CancellaDati.vbs \\?\G:\BCK_Day 30
Solitamente si usa cscript se si vuole una esecuzione sincrona e l'output a console o reindirizzato in file per logging o debug (poi io ragionerei se mettere un Wscript o Cscript con //nologo //b se non vuoi nessun feedback es cscript //nologo CancellaDati.vbs \\?\G:\BCK_Day )
oppure via codice vbscript crei un processo hidden
http://superuser.com/questions/62525/run-a-batch-file-in-a-completely-hidden-way
Gastone Canali >http://www.armadillo.it
Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere
- Modificato GastoneCanali venerdì 5 giugno 2015 11:08
- Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:13
venerdì 5 giugno 2015 10:54 -
Salve, ho provato a cercare in molti siti, ho anche provato la soluzione da te proposta a questo link http://ss64.com/nt/start.html ma nel mio caso non ha funzionato. Ecco perché mi sono rivolto a voi.
Grazie ancora
mercoledì 10 giugno 2015 07:08 -
Alla fine il problema è stato risolto utilizzando il seguente codice inserito nel batch file: cscript //nologo CancellaDati.vbs \\?\G:\BCK_Day
Grazie a tutti per la collaborazione e scusatemi se ho combinato qualche pasticcio comportamentale. Purtroppo sono un novello e devo imparare.
mercoledì 10 giugno 2015 07:12 -
Grazie per l’aggiornamento.
• Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto viene fornito “così come è e non comporta alcuna responsabilità da parte dell’azienda.
mercoledì 10 giugno 2015 07:40