27175 Letture

Copiare in un'unica directory i file contenuti in un insieme di sottocartelle

Problema: com'è possibile, in ambiente Windows, copiare tutti i file contenuti in un gruppo di sottocartelle all'interno di un'unica directory?
Si supponga di avere N file, di qualunque tipologia, distribuiti in una una serie di sottocartelle "nidificate" tra loro. Come si può recuperare tutti i file contenuti nelle varie sottodirectory e memorizzarli all'interno di una medesima cartella?

Le soluzioni sono molteplici anche se per un'operazione come questa si può evitare di dover ricorrere ad un software sviluppato da terze parti.
Proponiamo quindi, di seguito, un approccio basato sull'utilizzo di uno script VBS.

Per utilizzarlo, basta creare un nuovo file con estensione .vbs. Cliccando con il tasto destro su di esso quindi scegliendo Modifica si potrà editarlo con il Blocco Note di Windows (in alternativa è possibile ricorrere a qualunque altro editor di testo).


All'interno del file .vbs si dovrà incollare quanto segue:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\lavori\dir"
strDestination = "c:\temp\dir"


if right(strFolder,1)<>"\" then strFolder = strFolder & "\"
if right(strDestination,1)<>"\" then strDestination = strDestination & "\"

Set objFolder = objFS.GetFolder(strFolder)

Go(objFolder)

Sub Go(objDIR)
   If objDIR <> "\System Volume Information" Then
      For Each eFolder in objDIR.SubFolders
         Go eFolder
      Next
      For Each strFile In objDIR.Files
         strFileName = strFile.Name
         strExtension = objFS.GetExtensionName(strFile)
         If strExtension = "xls" Then
            if objFS.FileExists(strDestination & strFileName) then
               strFileName = objDIR.Name & "_" & strFileName
            end if
            objFS.CopyFile strFile , strDestination & strFileName
         End If
      Next
   End If
End Sub

A questo punto è necessario impostare i valori delle variabili strFolder (cartella di origine) e strDestination (cartella di destinazione).
Lo script VBS provvederà a copiare il contenuto di tutte le sottocartelle presenti nella directory strFolder salvandole poi nella cartella strDestination.


Com'è possibile verificare, lo script impiega poi un algoritmo ricorsivo per “scansionare” tutte le sottocartelle contenute nella directory di origine.

Nel caso in cui il file dovesse esistere già nella cartella di destinazione, il nome del file omonimo verrà modificato ponendo come prefisso il nome della directory che lo contiene (istruzione strFileName = objDIR.Name & "_" & strFileName).

Per come è stato sviluppato lo script, saranno copiati – dalla cartella di origine – solo i file con estensione xls. Ovviamente è possibile specificare un'altra estensione oppure personalizzare liberamente il blocco if (esempio: If strExtension = "xls" or strExtension = "doc" Then). La if può essere completamente eliminata nel caso in cui si desiderino copiare tutti i file, di qualunque tipologia.


Per avviare l'operazione di copia basta fare doppio clic sul file .vbs.

Suggeriamo di utilizzare il file VBS solo dopo averne ben compreso il funzionamento. In ogni caso è preferibile effettuare sempre almeno una copia di backup dei dati sui quali si intende operare.


  1. Avatar
    Michele Nasi
    25/05/2010 13:37:17
    Certo, gli approcci possibili sono tanti. In questo articolo volevamo comunque mostrare le possibilità offerte dallo scripting VBS. Se vuoi contribuire, apri pure un topic nel forum (previa iscrizione) e proponi pure la tua soluzione! :wink: Grazie.
  2. Avatar
    steverm
    25/05/2010 10:18:39
    ...ho fatto la stessa identica cosa con un file BAT/CMD sottosistema ms dos di windows, fa la stessa identica cosa come lo script VBS, io ho utilizzato pochissime righe ciaoa tutti e complimenti al vs sito
  3. Avatar
    Lucios
    17/03/2010 18:53:10
    Funziona alla grande!!! Complimenti alla redazione.
  4. Avatar
    Michele Nasi
    15/03/2010 12:02:53
    @Rob.erto: ho aggiunto due righe che effettuano un controllo circa la presenza del backslash finale. Nel caso in cui non fosse presente, viene aggiunto.
  5. Avatar
    Rob.erto
    14/03/2010 18:58:45
    Citazione:
    Citazione: Dovresti rivedere lo script: non funziona nel modo voluto...
    Cioè ?
    la terza riga va corretta così: strDestination = "c:\temp\dir\" :wink:
  6. Avatar
    jacopo
    13/03/2010 18:09:07
    Citazione: Dovresti rivedere lo script: non funziona nel modo voluto...
    Cioè ?
  7. Avatar
    Rob.erto
    13/03/2010 16:14:18
    Dovresti rivedere lo script: non funziona nel modo voluto... grazie
  8. Avatar
    Michele Nasi
    13/03/2010 09:39:28
    Grazie Francesco per la precisazione. E' comunque un "tip" noto (ne avevamo già parlato in passato). Ho voluto invece presentare la soluzione basata sullo script VBS perché la ritengo più rapida da usare e può "processare" in un colpo solo tutti i tipi di file. Il lettore è poi libero di scegliere quella che più preferisce. :wink:
  9. Avatar
    franc.esco
    13/03/2010 02:50:09
    Basta effettuare una ricerca di tutti i file presenti nella cartella di origine, tagliarli dalla finestra "risultati di ricerca" e incollarli in quella di destinazione. E per farlo basta solo saper usare Windows, non serve saper programmare
Copiare in un'unica directory i file contenuti in un insieme di sottocartelle - IlSoftware.it