Backup Visualsvn Using Powershell

under Programming PowerShell

 

Quick and easy backup for VisualSVN. Wraps the svnadmin.exe and performs a hotcopy of all repositories in the $source_path, dumping them to the $backup_path

param
(
    [string]$backup_path = $(throw "backup_path is required"),
    [string]$source_path = $(throw "source_path is required"),
    [string]$svnadmin = "C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe"
)
# Validate paths exist
if (!(Test-Path $backup_path -PathType Container))
{
    Write-Host "-backup_path $backup_path does not exist"
    exit -1
}
if (!(Test-Path $source_path -PathType Container))
{
    Write-Host "-source_path $source_path does not exist"
    exit -1
}
if (!(Test-Path $svnadmin -PathType Leaf))
{
    Write-Host "-svnadmin $svnadmin does not exist"
    exit -1
}
# Root user/non-repository data
$files = Get-ChildItem $source_path | Where {!$_.PsIsContainer} | Select-Object Name
foreach ($file in $files)
{
    Copy-Item (Join-Path $source_path $file.Name) (Join-Path $backup_path $file.Name)
}
# List of repository names (sub-directories under source path
$repositories = Dir $source_path | Where  {$_.mode -match "d"} | Select name
ForEach ($repo in $repositories)
{
    Write-Host $repo.Name
    # Remove existing backup directory for the repository
    if (Test-Path (Join-Path $backup_path $repo.Name))
    {
        Remove-Item -path (Join-Path $backup_path $repo.Name) -recurse -force
    }
    # Perform hot copy
    & $svnadmin "hotcopy" (Join-Path $source_path $repo.Name) (Join-Path $backup_path $repo.Name)
}