locked
File batch che lancia file vbscript per cancellare tutti i files e cartelle contenute in uno specifico path RRS feed

  • 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 Sub

    Tutto 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 diritti

    • Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:05
    • Contrassegno come risposta annullato lugimato mercoledì 10 giugno 2015 07:05
    • Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:08
    venerdì 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://blogs.technet.com/b/heyscriptingguy/archive/2007/12/05/hey-scripting-guy-how-can-i-start-a-script-in-a-hidden-window.aspx

    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
    exit

    Mentre 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 Sub

    Spero 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.
    Luigi

    giovedì 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 diritti

    • Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:05
    • Contrassegno come risposta annullato lugimato mercoledì 10 giugno 2015 07:05
    • Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:08
    venerdì 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://blogs.technet.com/b/heyscriptingguy/archive/2007/12/05/hey-scripting-guy-how-can-i-start-a-script-in-a-hidden-window.aspx

    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.

    • Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:12
    • Contrassegno come risposta annullato lugimato mercoledì 10 giugno 2015 07:12
    • Contrassegnato come risposta lugimato mercoledì 10 giugno 2015 07:12
    • Contrassegno come risposta annullato lugimato mercoledì 10 giugno 2015 07:13
    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