<% REM Questa parte non dovrebbe mai essere tolta: REM Midori folderSync v0.1 REM Questo script è da considerarsi DI PUBBLICO DOMINIO. REM Qualsiasi modifica ed uso sono ammessi, REM senza la necessità di nessun permesso. REM L'autore, per di più semianonimo, REM non è da ritenersi responsabile REM dell'uso che si faccia di tale script, REM che è potenzialmente molto pericoloso REM se non si comprende esattamente il suo scopo. REM REM Per qualsiasi informazione contattare: REM Midori, folderSync@paipai.net REM Sorgenti disponibili presso: REM http://www.paipai.net/texts/folderSync01.txt %> <% REM REM Descrizione: REM Lo script permette di: REM Copiare dei files da un folder sorgente ad uno destinatario. REM Nel caso in cui i files nel folder destinatario esistano già, REM lo script confronta le date di modifica e la dimensione dei files REM e sovrascrive i files nel folder destinatario REM solo se queste differiscono. REM Sincronizzare due folder, facendo in modo che REM la struttura del folder 1 diventi identica alla REM struttura del folder 2. REM REM Se le due funzioni vengono usare in sequenza, REM si ha come risultato due folder identici, REM sia in contenuto che in struttura. REM Pertanto esiste una terza subrutine che richiama REM in sequenza le altre due. REM REM Esempio di uso in sequenza: REM Scopo: Rendere "c:\Dati" identica a "d:\backups\c\Dati" REM REM backup "c:\Dati" , "d:\backups\c\Dati" REM sync "d:\backups\c\Dati", "c:\Dati" REM notare che gli argomenti sono invertiti in sync rispetto a backup REM Lo stesso lavoro viene fatto da: REM BackUpAndSync "c:\Dati" , "d:\backups\c\Dati" REM REM esempio d'uso di backup() da solo: REM scopo: aggiornare il backup con gli ultimi files inseriti/modificati REM REM backup "c:\Dati" , "d:\backups\c\Dati" %> <% REM NOTE: REM Ci sono un paio di problemini: I percorsi di rete non sono REM validi folder (ES: \\server\share); REM non si riesce mappare un percorso di rete REM (che risolverebbe il di cui sopra problema) REM Le funzioni di debug e log sono fatte, adesso REM sta a voi inserirle dove piu' vi fa comodo. REM Trasformare questo script da ASP a VBS eseguibile REM da Windows Scripting non dovrebbe essere REM troppo difficile e lo faro' io stesso a breve. REM Al momento c'e' una netta differenziazione REM tra sorgente e destinazione. I files non vengono mai copiati REM da destinazione a sorgente anche se in destinazione REM ci fossero dei files piu' nuovi di quelli in sorgente. %> <% dim DODEBUG, DOLOG, LOGFILE, LogFileHandle DODEBUG = false DOLOG = false LOGFILE = "c:\folderSync.log" if DOLOG then set fsObj = CreateObject("Scripting.FileSystemObject") if fsObj.FileExists(LOGFILE) then LogFileHandle = fsObj.getFile(LOGFILE) else fsObj.CreateTextFile LOGFILE, true LogFileHandle = fsObj.getFile(LOGFILE) end if end if sub DEBUG(debugMessage) if DODEBUG then response.write("DEBUG: " & debugMessage & "
" & vbNewLine) end sub sub LOG(logLine,FileHandle) if DOLOG then dim ts set ts = FileHandle.OpenAsTextStream(ForAppending) ts.WriteLine(logLine) end if end sub REM ********************************************************************* REM * * REM * restituisce vero se i files differiscono in data oppure dimensione* REM * * REM ********************************************************************* function isDifferent(file1,file2) dim result, fs result = true Set fs = CreateObject("Scripting.FileSystemObject") if fs.FileExists(file1) AND fs.FileExists(file2) then if fs.GetFile(file1).DateLastModified <> fs.GetFile(file2).DateLastModified then result = true else if fs.GetFile(file1).Size <> fs.GetFile(file2).Size then result = true else result = false end if end if end if set fs = nothing isDifferent = result end function REM *************************************************************** REM * * REM * copia i files dal folder source al folder dest, ma solo se * REM *i files sono piu' nuovi. * REM * la funzione esamina ricorsivamente anche i sub folder * REM * * REM *************************************************************** Sub backup(Source,Dest) Dim fs, f, SourceFolder Set fs = CreateObject("Scripting.FileSystemObject") if fs.FolderExists(Source) then set SourceFolder = fs.GetFolder(Source) if NOT fs.FolderExists(Dest) then SourceFolder.copy Dest,true '' se dest non esiste viene copiata pari pari DEBUG("Intera directory copiata: " & Source & " -->> " & Dest & "
" & vbnewline) end if else DEBUG("Directory Sorgente " & Source & " inesistente o inaccessibile" & "
" & vbnewline) exit sub 'source non esiste o e' inaccessibile end if ' prima copiamo tutti i files for each f1 in SourceFolder.Files f1DestPath = fs.BuildPath(dest,f1.name) if isDifferent(f1.Path,f1DestPath) then f1.copy f1DestPath,true end if next ' poi copiamo tutte le directory. for each f1 in SourceFolder.subFolders f1DestPath = fs.BuildPath(dest,f1.name) if fs.folderExists(f1DestPath) then backup fs.BuildPath(Source,f1.name), f1DestPath else f1.copy f1DestPath,true end if next set fs = nothing set f = nothing set sourceFolder = nothing End Sub REM ******************************************* REM * * REM * elimina i files presenti in Folder1 che * REM *non sono piu' presenti in Folder2 * REM * * REM ******************************************* sub sync(Folder1,Folder2) Dim fs, f, Folder1Folder Set fs = CreateObject("Scripting.FileSystemObject") if fs.FolderExists(folder2) AND fs.FolderExists(Folder1) then set Folder1Folder = fs.GetFolder(Folder1) else exit sub end if for each f1 in Folder1Folder.Files f1Folder2Path = fs.BuildPath(Folder2,f1.name) if NOT fs.FileExists(f1Folder2Path) then f1.delete true end if next for each f1 in Folder1Folder.subFolders f1Folder2Path = fs.BuildPath(Folder2,f1.name) if fs.folderExists(f1Folder2Path) then sync fs.BuildPath(Folder1,f1.name), f1Folder2Path else f1.delete true end if next set fs = nothing set f = nothing set folder1Folder = nothing end sub Sub BackUpAndSync(Source, Dest) backup source, dest sync dest, source end sub Sub ShowFileList(folderspec) Dim fs, f, f1, fc, s Set fs = CreateObject("Scripting.FileSystemObject") if fs.folderExists(folderspec) then Set f = fs.GetFolder(folderspec) Set fc = f.Files s = "

FolderSize: " & f.size & "

" For Each f1 in fc s = s & f1.path & " " & f1.size & "
" Next Set fc = f.subFolders For Each f1 in fc s = s & f1.path & " -DIR-" & "
" Next response.write s else response.write("Folder " & folderspec & " inesistente") end if End Sub %> <% sourceFolder = request("s") destFolder = request("d") %> Esempio d'uso di Midori folderSync

Esempio d'uso di folderSync:

Folder sorgente:

Folder destinatario:

<%if request("vai!") = "vai!" then%> <% REM attualmente lo script non funziona con percorsi di rete (es: "\\server\share") REM quello che segue e' un tentativo (non riuscito) di usare un'altra via per accedere REM a delle risorse di rete (mappatura temporanea in un drive). REM Se a qualcuno venisse in mente un'idea migliore, mi piacerebbe sentirla. 'dim SourceIsnetworkFolder,DestIsnetworkFolder, WshNetwork, SourceMapped, DestMapped 'login = "" 'pass = "" 'SourceMapped = "Z:" 'DestMapped = "X:" 'SourceIsNetworkFolder = false 'DestIsNetworkFolder = false REM riconosce se si tratta di un percorso di rete. 'if instr(sourceFolder,"\\")<>0 then 'SourceIsnetworkFolder = true 'Set WshNetwork = server.CreateObject("Wscript.Network") 'WshNetwork.MapNetworkDrive SourceMapped, sourceFolder, false, login, pass 'end if 'if instr(destFolder,"\\")<>0 then 'DestIsnetworkFolder = true 'Set WshNetwork = server.CreateObject("Wscript.Network") 'WshNetwork.MapNetworkDrive DestMapped, destFolder, false, login, pass 'end if 'if SourceIsnetworkFolder then TempSource = SourceMapped else TempSource = sourceFolder end if 'if DestIsnetworkFolder then TempDest = destMapped else TempDest = destFolder end if %> <% TempSource = sourceFolder tempDest = destFolder %>

PRIMA:

---- <%=sourceFolder%> <%if SourceIsnetworkFolder then response.write("-->> Mapped on: " & SourceMapped)%>---- <%ShowFileList(TempSource)%>

---- <%=destFolder%> <%if DestIsnetworkFolder then response.write("-->> Mapped on: " & destMapped)%>---- <%ShowFileList(TempDest)%> <% backup TempSource, TempDest sync TempDest, TempSource %> <% REM rimozione delle mappature di rete. if SourceIsnetworkFolder then Set WshNetwork = server.CreateObject("Wscript.Network") WshNetwork.RemoveNetworkDrive SourceMapped end if if DestIsnetworkFolder then Set WshNetwork = server.CreateObject("Wscript.Network") WshNetwork.RemoveNetworkDrive destMapped end if %>

------------------------------------------------------

DOPO:

---- <%=sourceFolder%> <%if SourceIsnetworkFolder then response.write("-->> Mapped on: " & SourceMapped)%>---- <%ShowFileList(TempSource)%>

---- <%=destFolder%> <%if DestIsnetworkFolder then response.write("-->> Mapped on: " & destMapped)%>---- <%ShowFileList(TempDest)%> <%end if%>