Нередко встречается ситуация, когда резервное копирование Windows Server выполняется на сетевую шару штатными средствами.
Разумеется, размер сетевой шары ограничен, а штатные срдства не имеют возможности удалять резервные копии старше определенного возраста.
Ситуацию можно решить с помощью скриптов, которые предлагаю вашему вниманию. Примеры скриптов взяты из Интернета, и дополнены мной под реальные сценарии для этой статьи. Если вы еще используете .bat-скрипты, обратите внимание насколько PowerShell проще и логичнее.
Для резервных копий Windows Server Backup, удалять нужно не все подряд, а только папки, и только с именем Backup %date%
# set folder path
$dump_path = "servershareidWindowsImageBackupservername"
# set min age of files
$max_days = "-3"
# get the current date
$curr_date = Get-Date
# determine how far back we go based on current date
$del_date = $curr_date.AddDays($max_days)
# delete the files
Get-ChildItem $dump_path -Recurse | Where-Object { $_.LastWriteTime -lt $del_date -and $_.Attributes -eq 'Directory' -and $_.name -like 'Backup*'} | Remove-Item -Recurse
Обратите внимание, Remove-Item запрашивает подтверждение, чтобы автоматически на него соглашаться, использование флагов -Confirm:$false и/или -Force не подходит (на TechNet описано, что они на самом деле делают), использовать нужно флаг -Recurse
Если вам нужно удалять резервные копии, которые делает SQL сервер, то удалять нужно не папки, а файлы (маску файлов указывать нет смысла, т.к. в этой папке только *.bak файлы):
# set folder path
$dump_path = "serversharefolder"
# set min age of files
$max_days = "-3"
# get the current date
$curr_date = Get-Date
# determine how far back we go based on current date
$del_date = $curr_date.AddDays($max_days)
# delete the files
Get-ChildItem $dump_path -Recurse | Where-Object {$_.LastWriteTime -lt $del_date} | Remove-Item -Recurse
Если продолжать про SQL, то резервное копирование штатными средства выполняется в локальную папку, где хранится какое-то время, а затем переносится в архив (сетевую шару):
#Path to already connected share $sourceFullPath = "C:MSSQLBackupdatabase" $targetFullPath = "serversharesqldatabase" # copy all files Get-ChildItem $sourceFullPath -Recurse | Move-Item -Destination $targetFullPath
Если вы хотите хранить резервные копии в нескольких местах, копировать их можно с помощью командлета Copy-Item , вот пример, в котором будут копироваться только свежие бэкапы:
#Path to already connected share
$sourceFullPath = "serversharesqldatabase"
# set target path
$targetServer = "server"
$targetFullPath = "$targetServersharesqldatabase"
$targetUsername = "username"
$targetPassword = "password"
net use $targetServer $targetPassword /USER:$targetUsername
# get the current date
$curr_date = Get-Date
# set min age of files
$max_days = "-1"
# determine how far back we go based on current date
$del_date = $curr_date.AddDays($max_days)
# copy all files
Get-ChildItem $sourceFullPath -Recurse | Where-Object {$_.LastWriteTime -gt $del_date} | Copy-Item -Destination $targetFullPath
#Disconnect shares
net use $targetServer /delete
Копировать бэкапы Windows Server Backup можно аналогичным образом (обратите внимание, папки будут перезаписаны):
#Path to already connected share $sourceFullPath = "servershareWindowsImageBackup" # set target path $targetServer = "server" $targetFullPath = "$targetServersharewsb" $targetUsername = "user" $targetPassword = "password" net use $targetServer $targetPassword /USER:$targetUsername # copy all folder Copy-Item $sourceFullPath $targetFullPath -Recurse -Container -ErrorAction SilentlyContinue #Disconnect shares net use $targetServer /delete
Для резервного копирования виртуальных машин Hyper-V, можно использовать HVBackup :
# set folder path
$targetFullPath = "serversharevms"
# set min age of files
$max_days = "-2"
# get the current date
$curr_date = Get-Date
# determine how far back we go based on current date
$del_date = $curr_date.AddDays($max_days)
# delete the files
Get-ChildItem $targetFullPath -Recurse | Where-Object {$_.LastWriteTime -lt $del_date} | Remove-Item -Recurse
# Run HVBackup
C:HVBackup.HVBackup.exe --a --compressionlevel 0 --output $targetFullPath 1> lastlog_out.txt 2> lastlog_err.txt
Копировать эти бэкапы в другое место можно так же, как и бэкапы SQL.
Эти и другие скрипты для управления резервным копированием удобно сложить в папку C:scripts , разрешить выполнение с помощью Set-ExecutionPolicy Remotesigned и автоматизировать выполнение в Task Scheduler. С последним пунктом могут быть вопросы, поэтому обратите внимание, в настройках Action нужно указать в качестве Program powershell , а в качестве Argument путь к скрипту:
Разумеется, все вышесказанное относится больше к тестовым средам и в реальной среде подойдет компаниям малого и очень малого размеров, для средних и крупных разумно будет использовать адекватное ПО, например, System Center Data Protection Manager.
Надеюсь озвученная информация будет полезной, а если нужна будет помощь — пишите мне на почту d.kagarlickij@outlook.com



