February
5th,
2008
A few days ago, I mentioned I did simple backups using the SyncToy powertool, and mentioned I might try replacing it with Robocopy. The end result is a simple PowerShell script that drives Robocopy. It simply backs up a specific set of directories and my VPC data virtual hard drive (.vhd) into a new folder with the current date, and leaves a log of the entire process.
The script also makes it easy to specify for each folder a set of file extensions to ignore. For example, I don't want to include object files when backing up my source code trees.
Anyway, it's not fancy, but it does the trick. Here's the script:
function script:filename([string] $path) {
return [System.IO.Path]::GetFileName($path)
}
function stars {
return (new-object string ('*', 80))
}
$BASE = 'g:\backups'
$today = [datetime]::Today.ToString("yyyyMMdd");
$dest = "$BASE\$today"
$log = "$dest\log.txt"
if ( -not (test-path $dest) ) {
mkdir $dest
}
#
# write header
#
write (stars) >> $log
write "Backup procedure starting at " `
([datetime]::Now.ToString()) >> $log
write (stars) "`r`n`r`n" >> $log
#
# stop CVS services
#
net stop cvsnt >> $log
net stop cvslock >> $log
#
# backup our set of folders
#
$folders = (
('e:\CVS', ''),
('e:\devdeo', ''),
('e:\home', '*.swp'),
('e:\projects', '*.swp *.obj *.exe *.dll *.pdb *.pch *.idb'),
('e:\opensource', '*.swp *.obj *.exe *.dll *.pdb *.pch *.idb'),
('e:\tools', '')
)
$folders | %{
$name = filename($_[0])
$excludes = $_[1].Split(' ')
robocopy $_ "$dest\$name" *.* /E /ZB /NP /XF $excludes >> $log
}
#
# backup our VPC data file
#
robocopy 'E:\vpc\' $dest 'datos.vhd' /NP >> $log
#
# restart CVS services
#
net start cvsnt >> $log
net start cvslock >> $log
#
# write footer
#
write "`r`n`r`n" (stars) >> $log
write "Backup procedure finished at " `
([datetime]::Now.ToString()) >> $log
write (stars) >> $log
write "Backup done. Check log file for details."
write $log
return [System.IO.Path]::GetFileName($path)
}
function stars {
return (new-object string ('*', 80))
}
$BASE = 'g:\backups'
$today = [datetime]::Today.ToString("yyyyMMdd");
$dest = "$BASE\$today"
$log = "$dest\log.txt"
if ( -not (test-path $dest) ) {
mkdir $dest
}
#
# write header
#
write (stars) >> $log
write "Backup procedure starting at " `
([datetime]::Now.ToString()) >> $log
write (stars) "`r`n`r`n" >> $log
#
# stop CVS services
#
net stop cvsnt >> $log
net stop cvslock >> $log
#
# backup our set of folders
#
$folders = (
('e:\CVS', ''),
('e:\devdeo', ''),
('e:\home', '*.swp'),
('e:\projects', '*.swp *.obj *.exe *.dll *.pdb *.pch *.idb'),
('e:\opensource', '*.swp *.obj *.exe *.dll *.pdb *.pch *.idb'),
('e:\tools', '')
)
$folders | %{
$name = filename($_[0])
$excludes = $_[1].Split(' ')
robocopy $_ "$dest\$name" *.* /E /ZB /NP /XF $excludes >> $log
}
#
# backup our VPC data file
#
robocopy 'E:\vpc\' $dest 'datos.vhd' /NP >> $log
#
# restart CVS services
#
net start cvsnt >> $log
net start cvslock >> $log
#
# write footer
#
write "`r`n`r`n" (stars) >> $log
write "Backup procedure finished at " `
([datetime]::Now.ToString()) >> $log
write (stars) >> $log
write "Backup done. Check log file for details."
write $log
Here's the source as well.
Technorati tags: PowerShell, Robocopy