Newsgroup: it.comp.os.win.windows10
Titolo: [backup] come fare per fare quel che vorrei fare? (paratotòcit.)

>>>>  
http://www.bb2002.it
 :)  <<<<<
........... [ al lavoro ] ...........

 lo cancellerebbe pure lui... e allora sarebbe inutile :)
 
Potresti mettere in piedi un pezzo di vbscript o, se preferisci,
powershell che si occupi di eliminare i backup più vecchi; per quanto
poi riguarda il discorso "vecchi" direi che potresti impostare il
valore a 3 settimane, così non rischierai problemi ;)
 
giusto come esempio (scritto al volo, non ho verificato che funzioni),
lo salvi come "delold.vbs" e lo lanci con
 
cscript delold.vbs 21 x:\path
 
dove 21 è il numero limite di giorni ed x:\path il percorso che
contiene i files di backup; per semplificare le cose ti puoi creare un
batch che copi i backup su NAS e poi elimini i backup obsoleti, ad
esempio
 
@echo off
:
echo copia dei backup su NAS
xcopy \\server\backup\*.* \\nas\backup /Y/S/J/M
:
echo eliminazione dal NAS dei backup obsoleti
cscript delold.vbs 21 \\nas\backup
 
qui sotto il codice da inserire in "delold.vbs"
 
 
' ==========================================
 
  Dim arg, fso
 
  Set arg = WScript.Arguments
  Set fso = CreateObject("Scripting.FileSystemObject")
  WScript.Quit main(arg.Count, arg)
 
Function main(argc, argv)
  Dim sPath, nDays
 
  If argc <> 2 Then
    main = 1
    Exit Function
  End If
  nDays = CLng(argv(0))
  sPath = argv(1)
  DelOldFiles sPath, nDays
  main = 0
End Function
 
Sub DelOldFiles(sPath, nMaxAge)
  Dim fld, sfd, fil, dtFile
  Dim colFiles
 
  On Error Resume Next  
 
  If Not fso.FolderExists(sPath) Then
    Exit Sub
  End If
  Set fld = fso.GetFolder(sPath)
  For Each sfd In fld.SubFolders
    DelOldFiles sfd.Path, nMaxAge
  Next
  Set colFiles = CreateObject("Scripting.Dictionary")
  For Each fil In fld.Files
    If LCase(Right(fil.Name, 4)) = ".bak" Then
      dtFile = CDate(fil.DateCreated)
      If DateDiff("d", dtFile, Now) > nMaxAge Then
        colFiles.Add fil.Path, fil.Path
      End If
    End If
  Next  
  If (colFiles.Count < 1) Then
    Exit Sub
  End If  
  For Each fil In colFiles
    fso.DeleteFile fil, True
  Next
End Sub
 
' ==========================================
 
 
 
 
 

 powershell che si occupi di eliminare i backup più vecchi;
 
yes, grazie, dovrebbe funzionare
adesso mi sparo le brevi ferie poi ci torno su


   Next  
 
test: cancello quelli più vecchi di 30 giorni:
 
delold.vbs 30 .\s
 
non funziona
 
ho provato anche a debuggarlo con cscript ma non succede nulla :/
 
il file c'è:
 
C:\Users\HelpDesk\Downloads>dir *.vbs
 Volume in drive C is Windows7_OS
 Volume Serial Number is CA73-22B5
 
 Directory of C:\Users\HelpDesk\Downloads
 
09/08/2018  09:06             1,174 delold.vbs
               1 File(s)          1,174 bytes
               0 Dir(s)  52,026,777,600 bytes free
 
il comando cscript pure:
 
C:\Users\HelpDesk\Downloads>cscript
 
Usage: CScript scriptname.extension [option...] [arguments...]
 
Options:
 //D         Enable Active Debugging
 //I         Interactive mode (default, opposite of //B)
 //X         Execute script in debugger
 
 
ma se lo eseguo così:
 
C:\Users\HelpDesk\Downloads>cscript //x delold.vbs 30 .\s
 
non succede nulla
 
anche mettendo //x DOPO il vbs
 
C:\Users\HelpDesk\Downloads>cscript delold.vbs //x 30 .\s
 
o aggiungendo altri parametri:
 
C:\Users\HelpDesk\Downloads>cscript delold.vbs //x //d //i 30 .\s
 
ho provato anche con il percorso completo:
 
delold.vbs 30 C:\Users\HelpDesk\Downloads\s
 
mo' me lo rileggo per benino sto vbs...


 date:
 
questo l'ho provato, funziona (nota: i separatori "==..." NON debbono
essere copiati nello script vbs :D); ho anche aggiunto un minimo di
logging a video, così vedi quello che lo script sta facendo
 
==========================================================
 
  Option Explicit
 
  Dim arg, fso
 
  Set arg = WScript.Arguments
  Set fso = CreateObject("Scripting.FileSystemObject")
  WScript.Quit main(arg.Count, arg)
 
Function main(argc, argv)
  Dim sPath, nDays
  Dim sName, nFiles
 
  sName = WScript.ScriptName
 
  If argc <> 2 Then
    printf "usage: cscript " & sName & " nDays Path"
    printf "e.g. : cscript " & sName & " 30 x:\temp"
    main = 1
    Exit Function
  End If
  nDays = CLng(argv(0))
  If nDays < 1 Then
    printf "Invalid number of days"
    main = 2
    Exit Function
  End If
  sPath = argv(1)
  If Not fso.FolderExists(sPath) Then
    printf "Invalid path " & sPath
    main = 3
    Exit Function
  End If
 
  printf "Deleting old files from " & sPath & " ..."
  nFiles = DelOldFiles(sPath, nDays)
  printf "All done, " & nFiles & " file(s) deleted."
  main = 0
End Function
 
Function DelOldFiles(sPath, nMaxAge)
  Dim fld, sfd, fil, dtFile
  Dim colFiles, nTotFiles
 
  On Error Resume Next  
  DelOldFiles = 0
 
  If Not fso.FolderExists(sPath) Then
    printf "Non existing folder " & sPath
    Exit Function
  End If
  Set fld = fso.GetFolder(sPath)
  For Each sfd In fld.SubFolders
    nTotFiles = nTotFiles + DelOldFiles(sfd.Path, nMaxAge)
  Next
  Set colFiles = CreateObject("Scripting.Dictionary")
  For Each fil In fld.Files
    dtFile = CDate(fil.DateCreated)
    If DateDiff("d", dtFile, Now) > nMaxAge Then
      colFiles.Add fil.Path, fil.Path
    End If
  Next  
  If (colFiles.Count < 1) Then
    Exit Function
  End If  
  nTotFiles = nTotFiles + colFiles.Count
  For Each fil In colFiles
    printf "- " & fil
    fso.DeleteFile fil, True
  Next
  DelOldFiles = nTotFiles
End Function
 
Sub printf(sTxt)
  WScript.StdOut.WriteLine sTxt
End Sub
 
==========================================================
 
 

 questo l'ho provato, funziona
 
ok, primo test: delold.vbs 60 .\s
 
errore line 74, char 3, handle invalid, 80070006
 
  WScript.StdOut.WriteLine sTxt
 
devo installare qualche libreria aggiuntiva al mio windows 7 per far 
funzionare WScript.StdOut.WriteLine ?


 grazie
 
Soluzione semplice: Robocopy con opzione /MIR (occhio, è 
"bidirezionale")

 funzionare WScript.StdOut.WriteLine ?
 
Uffa, dimentico sempre che ci sono installazioni handicappate; ok,
sostituisci la riga
 
WScript.StdOut.WriteLine sTxt
 
con
 
WScript.Echo sTxt
 
e dovrebbe andare
 
ciao
 

 "bidirezionale")
 
Non è quello che vuole, altrimenti lo avrei già suggerito :)
 
 
 
 

 
 
come faccio a disandicapparmi? ;)
 
ok lo provo al rientro dalle vacanze, tra una decina di giorni :)


 come faccio a disandicapparmi? ;)
 
leggi qui :) e considera che, come ho scritto, il vbs va lanciato da
command line usando "cscript" e NON funziona se lo lanci con un doppio
click o se dimentichi di premettere "cscript"
 
https://stackoverflow.com/questions/774319/why-does-this-vbscript-give-me-an-error
 
 
in qualsiasi caso, usa questo per editare il vbscript
 
http://www.vbsedit.com/
 
 
;-)
 

ObiWan ha detto questo giovedì :

Perché no? Cancella automaticamente i file che sono già stati 
precedentemente cancellati sul server

 powershell che si occupi di eliminare i backup più vecchi; per quanto
 
Tipo questo?
 
$limit = (Get-Date).AddDays(-$args[0])
$delpath = $args[1]
 
# Delete files older than the $limit.
Get-ChildItem -Path $delpath -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
 
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $delpath -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
 
Enrico