PowerShell Script ile HyperV Yedekleme
Merhaba arkadaşlar , Bu script ile hyperv sanal makinelerinizi Otomatik yedekleyebilirsiniz.
Özellikler:
Tarih saat bilgini alır.
Log alır.
Mail Parolası Şifrelenmiştir.
Mail Gönderir.
Mail parolası oluşturmak için aşağıdaki kodu powershellde çalıştırın:
$securePassword = Read-Host "Parolanizi Girin" -AsSecureString; $securePassword | ConvertFrom-SecureString | Set-Content "C:\Scripts\credentials.encrypted"
Bu kod C:\Scripts\ dizininde credentials.encrypted isminde bir dosya oluşturacaktır isterseniz buradaki dizinide değiştirip daha farklı bir alanda saklayabilirsiniz.
C:\Scripts\Backup-HyperV.ps1 dizinine script dosyasını oluşturun. (Sizin kurgunuza göre farklı bir alandada oluşturabilirsiniz önemli olan görev zamanlayıcıda ilgili dizini göstermektir.)
# -------------------- Ayarlar --------------------
$vmName = "Sanal Makine Adı" # <-- Buraya yedeklenecek VM'in adını yaz
$backupRoot = "SanalMakineYedeklemeDizini\$vmName"
$maxBackups = 3 #Kaç adet yedek alsın bir öncekini siler
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm"
$backupPath = Join-Path $backupRoot "$vmName-$timestamp"
$logPath = Join-Path $backupRoot "BackupLog-$timestamp.log"
# Mail ayarları (Gmail için)
$gmailUser = "Mail adresiz"
$encryptedPasswordFile = "Şifreyi oluşturduğunuz dizin\credentials.encrypted"
$mailTo = "GonderilecekMail"
$smtpServer = "smtp.gmail.com"
$smtpPort = 587
# Şifreli dosyadan gmail şifresini oku
try {
$securePassword = Get-Content $encryptedPasswordFile | ConvertTo-SecureString
$gmailPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePassword))
} catch {
Write-Error "Şifreli dosya okunamadı. Lütfen şifre dosyasını oluşturun."
exit 1
}
# -------------------- Log Başlat --------------------
Start-Transcript -Path $logPath -Append
# -------------------- Yedekleme İşlemi --------------------
$backupSuccess = $false
try {
Write-Host "[$timestamp] Yedekleme basliyor: $vmName"
Export-VM -Name $vmName -Path $backupPath -ErrorAction Stop
Write-Host "[$timestamp] Yedekleme tamamlandi: $backupPath"
$backupSuccess = $true
# Eski yedekleri temizle
$backups = Get-ChildItem -Path $backupRoot -Directory | Where-Object { $_.Name -like "$vmName-*" } | Sort-Object LastWriteTime -Descending
if ($backups.Count -gt $maxBackups) {
$backupsToDelete = $backups | Select-Object -Skip $maxBackups
foreach ($item in $backupsToDelete) {
Write-Host "Eski yedek siliniyor: $($item.FullName)"
Remove-Item -Path $item.FullName -Recurse -Force
}
}
}
catch {
$errorMsg = $_.Exception.Message
Write-Error "HATA OLUŞTU: $errorMsg"
}
# -------------------- Log Durdur --------------------
Stop-Transcript
# -------------------- Mail Gönder --------------------
if ($backupSuccess) {
$body = @"
Hyper-V VM yedegi basariyla alindi.
VM: $vmName
Tarih: $timestamp
Konum: $backupPath
Log dosyasi ekte yer almaktadir.
"@
$subject = "Yedekleme Basarili ($vmName)"
}
else {
$body = @"
HATA! Hyper-V VM yedek alinamadi.
VM: $vmName
Tarih: $timestamp
Log dosyası ekte detaylı bilgi icerir.
"@
$subject = "Yedekleme Hatasi ($vmName)"
}
Send-MailMessage -From $gmailUser -To $mailTo -Subject $subject `
-Body $body -SmtpServer $smtpServer -Port $smtpPort -UseSsl `
-Credential (New-Object System.Management.Automation.PSCredential($gmailUser, (ConvertTo-SecureString $gmailPassword -AsPlainText -Force))) `
-Attachments $logPath
Write-Host "Mail gonderildi: $subject"
Görev zamanlayıcıya eklemek için İlgili görseller.
Denetim Masası\Tüm Denetim Masası Öğeleri\Yönetimsel Araçlar\ Görev Zamanlayıcıyı açın, daha sonra orta penceredeyken mause sağ tık yeni görev oluştur seceneğini tıklayınız ve resimleri takip ederek alanları doldurun.



Bağımsız Değişken ekle kısmına bu kodu yazın
-ExecutionPolicy Bypass -File "C:\Scripts\Backup-HyperV.ps1" -NoProfile -NoLogo

İlgili İşlemler bukadar Oluşturduğunuz göreve çalıştır diyerek test edebilirizsiniz. Yararlı olması dileğiyle
Harika bir bilgi teşekkürler uygulayıp deneyeceğim.
Teşekkür ederim. Umarım yararlı olur. iyi çalışmalar.