-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArchiveFolder.ps1
60 lines (49 loc) · 1.7 KB
/
ArchiveFolder.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
param (
[Parameter(Mandatory=$true)]
[ValidateScript({Test-Path $_ -PathType 'Container'})]
[string]$FolderToBackup,
[Parameter(Mandatory=$true)]
[ValidateScript({Test-Path $_ -PathType 'Container'})]
[string]$ArchiveFolder,
[Parameter()]
[int]$RetentionDays = 14
)
# Create backup and archive folders if they don't exist
if (-not (Test-Path $FolderToBackup)) {
Write-Error "Folder to backup does not exist: $FolderToBackup"
exit 1
}
if (-not (Test-Path $ArchiveFolder)) {
New-Item -Path $ArchiveFolder -ItemType 'Directory' | Out-Null
}
# Generate a unique backup name based on current date and time
$BackupName = 'Backup_{0:yyyyMMdd_HHmmss}' -f (Get-Date)
# Create a new zip archive for the backup
$ZipPath = Join-Path -Path $ArchiveFolder -ChildPath "$BackupName.zip"
$ZipFile = [System.IO.Compression.ZipFile]::Open($ZipPath, 'Create')
try {
# Copy all files from the folder to backup into the zip archive
Get-ChildItem -Path $FolderToBackup -Recurse -File | ForEach-Object {
$RelativePath = $_.FullName.Substring($FolderToBackup.Length + 1)
$Entry = $ZipFile.CreateEntry($RelativePath)
$EntryStream = $Entry.Open()
$FileStream = $_.OpenRead()
try {
$FileStream.CopyTo($EntryStream)
}
finally {
$FileStream.Close()
$EntryStream.Close()
}
}
}
finally {
$ZipFile.Dispose()
}
# Move the zip file to the archive folder
$ZipFile.MoveTo($ArchiveFolder)
# Delete archives older than the retention period
$OldArchives = Get-ChildItem -Path $ArchiveFolder -File | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-$RetentionDays)
}
$OldArchives | Remove-Item -Force