<package>

<job id="DoneInVBS">
<?job error="true" debug="true" ?> 
<script language="VBScript">

Const IdNoLog  = 0
Const IdNoEcho = 1
Const IdHelp   = 2
Const IdDirOr  = 3
Const IdDirDest= 4
Const IdDirLog = 5
' ***************************************
' Costanti di Errore
' ***************************************
Const NoErr        = 0
Const ErrNoSource  = 1
Const ErrParamDupl = 20
Const ErrDirCreate = 30


Public DirOr
Public DirDest
Public LogDir

Public Nfiles
Public NfilesCopied
Public NfilesUnMod
Public NfilesErr
Public KDim
Public fso
Public NomeLogDayFile
Public InizioLavori

' **********************************
' Variabili relative agli argomenti
' **********************************
Public NoLog
Public NoEcho

Main

Sub Main( )
  
   ' **********************************************
   ' VALORI DI DEFAULT: MODIFCARE SE NECESSARIO
   ' **********************************************
   DirOr="c:\arch_def"
   DirDest="g:\arch_def"
   LogDir="c:\LOGDIR"
   ' **********************************************
   Set fso = CreateObject("Scripting.FileSystemObject")
   InitVariabili() 
   Parametri()  
   NomeLogDayFile=GeneraNomeLogFile
   s= DuplicaStruttura(DirOr,DirDest, fso)
   s = ShowFolderList(DirOr,fso)

   Logga "****************************",1
   Logga "*       R E P O R T        *",1
   Logga "****************************",1
   Logga "Directory Origine    : " & DirOr, 1
   Logga "Directory Detinazione: " & DirDest, 1
   Logga "Inizio operazione    : " & InizioLavori, 1
   Logga "Fine operazione      : " & OrarioDiAdesso, 1
   Logga "Files analizzati     : " + Cstr(NFiles),1
   Logga "Files backuppati     : " + Cstr(NFilesCopied),1
   Logga "Files invariati      : " + Cstr(NFilesUnMod),1
   Logga "Errori rilevati      : " + Cstr(NFilesErr),1
   Logga "Bytes analizzati     : " + FormatNumber(KDim,0)+" Bytes",1
   KDim=KDim/(1024*1024)
   Logga "MegaByte analizzati  : " + FormatNumber(KDim,2)+" Mb",1
End Sub
   
Sub InitVariabili() 
   TabStop = Chr(9)
   InizioLavori=OrarioDiAdesso
   NFiles=0
   NFilesCopied=0
   NFilesUnMod=0
   NFilesErr=0
   KDim = 0
End Sub

Sub Parametri() 
Dim Argomento
Dim t, c, i ,A
  NoLog=false
  NoEcho=false
  c=Chr(34)
  A= Array(0,0,0,0,0,0)
  Set objArgs = WScript.Arguments
  For I = 0 to objArgs.Count - 1
     Argomento=TRIM(UCASE(objArgs(I)))
     IF (argomento="/NOLOG") THEN
        NoLog=True
        A(IdNoLog)=A(IdNoLog)+1
     ElseIf (argomento="/NOECHO") Then
        NoEcho=True
        A(IdNoEcho)=A(IdNoEcho)+1
     ElseIf ((argomento="/HELP") OR (argomento="/?")) Then
     	 t=t+"==============================================================================" +vbCrLf
     	 t=t+"                H O S T S C R I P T      D  U  P  L  I  C  A                  " +vbCrLf
     	 t=t+"==============================================================================" +vbCrLf
     	 t=t+"Ricopia il contenuto di una directory in maniera incrementale." +vbCrLf
     	 t=t+"Al tempo stesso scrive un dettagliato file di log delle operazioni compiute"+vbCrLf+vbCrLf
     	 t=t+"DUPLICA [/O:" & c & "Origine" & c & "] /D:" & c & "Destin." & c & " [/L:" & c & "LogDir" & c & "] [/NOECHO] [/NOLOG] [/HELP]"+vbCrlF
         t=t+"------------------------------------------------------------------------------"+vbCrLf
         t=t+"Origine           Indica la directoy da copiare."+vbcrlf
         t=t+"                  Se omessa usa la directory corrente."+vbCrlf
         t=t+"Destin.           Indica il percorso completo dove dove copiare l'origine"+vbCrlf
         t=t+"LogDir            Indica la directory dove registrare il log"+vbCrlf
         t=t+"                  Se omessa usa la directory " & LogDir & vbCrlf
         t=t+"/NOECHO           A video non verrĂ  visualizzato alcun messaggio"+vbCrlf
         t=t+"/NOLOG            Nessuna registrazione nel file di LOG"+vbCrlf
         t=t+"/HELP o /?        Fornisce questo help"+vbCrlf+vbCrlf
         t=t+"I parametri Origine, Destinazione e LogDir necessitano di doppi apici"+vbCrLf
         t=t+"qualora il nome della directory contenga degli spazi."+vbCrLf
         t=t+"------------------------------------------------------------------------------"
         WScript.Echo t
         WScript.Quit 
     ElseIf (Left(argomento,3)="/O:") Then
         DirOr=Mid(argomento,4)
         A(idDirOr)=A(idDirOr)+1
     ElseIf (Left(argomento,3)="/D:") Then
         DirDest=Mid(argomento,4)
         A(IdDirDest)=A(IdDirDest)+1
     ElseIf (Left(argomento,3)="/L:") Then
         LogDir=Mid(argomento,4)
         A(IdDirLog)=A(IdDirLog)+1
     End if   
  Next
  If (A(IdDirOr)> 1) Then
     WScript.Echo "Parametro /O: duplicato!"
     WScript.Quit ErrParamDupl+IdDirOr
  Elseif not fso.FolderExists(DirOr) Then
     WScript.Echo "Directory d'origine ",DirOr," non trovata!"
     WScript.Quit ErrNoSource
  End if
  If (A(IdDirDest)> 1) Then
     WScript.Echo "Parametro /D: duplicato!"
     WScript.Quit ErrParamDupl+IdDirDest
  Elseif Not CreaDirectory(DirDest,fso) Then
     WScript.Quit ErrDirCreater+IdDirDest
  End if
  If (A(IdDirLog)> 1) Then
     WScript.Echo "Parametro /L: duplicato!"
     WScript.Quit ErrParamDupl+IdDirLog
  Elseif Not CreaDirectory(LogDir,fso) Then
     WScript.Quit ErrDirCreater+IdDirLog
  End if
End Sub

Sub Logga(frase,Dove) 
Dim ts

  Const ForReading = 1, ForWriting = 2, ForAppending = 8 
  Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 
  
  If Not NoEcho Then
     WScript.Echo frase
  End If   
  If NoLog Then Exit Sub
    
  ' *** LOG PRINCIPALE
  if dove=1 then
     Set ts = fso.OpenTextFile(LogDir+"\MAINLOG.LOG",ForAppending, true)
     ts.Writeline frase 
     ts.Close
  elseif (dove=2) then
     Set ts = fso.OpenTextFile(LogDir+"\"+ NomeLogDayFile+".LOG",ForAppending, true)
     ts.Writeline frase 
     ts.Close
  end if   
End Sub

Function SonoUguali(fileOR, FileDest, fso)
Dim fO, fD
   SonoUguali=false
   if (Not fso.FileExists(fileDest) ) then
      Exit Function
   end if 
   Set fO = fso.GetFile(fileOR)
   Set fD = fso.GetFile(fileDest)
   fD.attributes = 0
'   SonoUguali=(fO.DateLastModified=fD.DateLastModified)
   ' per gestire il ritardo nella copia (3 secondi)
   SonoUguali=(fix(abs( (fO.DateLastModified-fD.DateLastModified)*86400)) < 3)

End Function

Function OrarioDiAdesso() 
Dim Ora
  Ora=FormatDateTime(Now,3)
  if Len(Ora)<>8 then
     Ora="0"+Ora
  end if   
  OrarioDiAdesso=FormatDateTime(Now,2)+" - "+Ora
End Function

Function GeneraNomeLogFile() 
Dim tmp
Dim Ora
  tmp=FormatDateTime(Now,2)
  tmp=right(tmp,4)+mid(tmp,4,2)+Left(tmp,2)
  Ora=FormatDateTime(Now,3)
  if Len(Ora)<>8 then
     Ora="0"+Ora
  end if   
  GeneraNomeLogFile=tmp+Left(ora,2)+Mid(Ora,4,2)+Right(Ora,2)
end Function

Function CreaDirectory(NomeFolder, fso)
  On Error resume next
  If Not fso.FolderExists(NomeFolder) Then
      fso.CreateFolder(NomeFolder)
      If Not fso.FolderExists(NomeFolder) Then
         Logga "XXXX - Errore    : Directory: " +NomeFolder + " non creata!", 2
'         WScript.echo "XXXX - Errore    : Directory: " +NomeFolder + " non creata!"
         CreaDirectory=false
         Exit Function
      else
         Logga NomeFolder  & " creata!", 2
      end if
  End If
  CreaDirectory=true
End function

Function ShowFolderList(FolderOr, fso)
Dim FolderDest, NomeFileOr, NomeFileDest
Dim fdO, efO, edO, fiO

   Dim f, f1, fc, s, ef, fi
   FolderDest=DirDest+Mid(FolderOr,len(DirOr)+1)
   Set fdO = fso.GetFolder(FolderOr)
   set efO=fdO.Files
   On Error resume next
   if efO.count > 0 then
      For Each fiO in efO
         NomeFileOr=fso.BuildPath(FolderOr ,fiO.name ) 
         NomeFileDest=fso.BuildPath(FolderDest, fiO.name ) 
         if Not SonoUguali(NomeFileOr,NomeFileDest, fso) then
            if NomeFileOr<>".\lz.mdb" and instr(NomeFileOr,"NoBackup")=0 then
               fso.CopyFile NomeFileOr, NomeFileDest, true
               if Not SonoUguali(NomeFileOr,NomeFileDest, fso) then
                  Logga "XXXX - Errore    : " +NomeFileOr + " [#-> " + err.description+ " <-#]", 2
                  NFilesErr=NFilesErr+1
               else   
                  Logga "Ho copiato       : "+NomeFileOr, 2
                  NFilesCopied=NFilesCopied+1
               end if
            end if   
         else
      '      Logga "Invariato        : "+NomeFileOr, 2
            NFilesUnMod=NFilesUnMod+1
         end if
         NFiles=NFiles+1
         KDim=KDim+fiO.size
      next 
   end if
   Set edO = fdO.SubFolders
   if edO.count>0 then
      For Each fdO in edO
         NomeDir=fso.BuildPath(FolderOr, fdO.name ) 
         s = s & NomeDir&  vbcrlf
         s=s & ShowFolderList(NomeDir, fso)
      Next
   end if
   ShowFolderList = s
End Function

' ========================================================================================
' =
' =   Duplica la struttura delle directory senza copiare i file
' =
' ========================================================================================
Function DuplicaStruttura(ByVal folderOr,ByVal folderDest,ByRef fso) 
   Dim f, f1, fc, s
   Dim NomeDirDest, NomeDirOr
   Set f = fso.GetFolder(folderOr)
   if ( CreaDirectory(folderDest,fso) ) then
'      Logga folderDest  & " creata!", 2
   End If
   Set fc = f.SubFolders
   if (fc.count>0) then
      For Each f1 in fc
         NomeDirOr=fso.BuildPath(folderOr, f1.name ) 
         NomeDirDest=fso.BuildPath(folderDest, f1.name ) 
         s = s & NomeDirDest &  vbcrlf
         s = s & DuplicaStruttura(NomeDirOr, NomeDirDest, fso)
      Next
   end if
   DuplicaStruttura = s
End Function

</script>
</job>


</package>