分享一个wsl和一个VirtualBox的定时备份脚本,这两个脚本的优点是都加了备份失败自动发邮件以及清理过时的备份的功能。

wsl的:

# attempt to run your exe.  iex is an alias for the invoke-expression cmd
wsl.exe --export Ubuntu-20.04 D:\Backup\Ubuntu-2004_$((Get-Date).ToString('yyyy-MM-dd')).tar
# Write-Output $?
# $? lets us know if the previous command was successful or not
if (!$?)
{
    $From = "@qq.com"
    $To = "[email protected]"
    $Subject = $((Get-Date).ToString('yyyy-MM-dd')) + " WSL backup failed!" 
    $Body = "WSL backup failed!"
    $smtpServer = "smtp.qq.com"
    $smtpPort = 587
    $username = "[email protected]"
    $password = "xxxx"

    $SMTPMessage = New-Object System.Net.Mail.MailMessage($From, $To, $Subject, $Body)
    $SMTPClient = New-Object Net.Mail.SmtpClient($smtpServer, $SmtpPort) 
    $SMTPClient.EnableSsl = $false 
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $password); 
    $SMTPClient.Send($SMTPMessage)
}

$FilePath = "D:\Backup"
$DaysAgo=3
$Today=Get-Date

Get-ChildItem -Path  $FilePath "*.tar" | Where-Object {$_.LastWriteTime -lt $Today.AddDays(-$DaysAgo)} |Remove-Item

上述脚本需要自己修改一下wsl的导出命令为你自己的wsl系统名和导出路径。

VirtualBox的:

VBoxManage controlvm "Ubuntu 20.04" poweroff
VBoxManage export "Ubuntu 20.04" -o D:\Backup\ubuntu-2004_VBox_$((Get-Date).ToString('yyyy-MM-dd')).ova
if (!$?)
{
    $From = "[email protected]"
    $To = "[email protected]"
    $Subject = $((Get-Date).ToString('yyyy-MM-dd')) + " WSL backup failed!" 
    $Body = "WSL backup failed!"
    $smtpServer = "smtp.qq.com"
    $smtpPort = 587
    $username = "[email protected]"
    $password = "xxx"

    $SMTPMessage = New-Object System.Net.Mail.MailMessage($From, $To, $Subject, $Body)
    $SMTPClient = New-Object Net.Mail.SmtpClient($smtpServer, $SmtpPort) 
    $SMTPClient.EnableSsl = $false 
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $password); 
    $SMTPClient.Send($SMTPMessage)
}

$FilePath = "D:\Backup"
$DaysAgo=3
$Today=Get-Date

Get-ChildItem -Path  $FilePath "*.ova" | Where-Object {$_.LastWriteTime -lt $Today.AddDays(-$DaysAgo)} |Remove-Item

上述脚本需要自己修改一下VirtualBox的导出命令的系统名以及导出路径。

注意:如果想实现备份失败自动发邮件的功能,你需要自己修改一下前述两个脚本的smtp配置。

脚本准备好之后,我们打开Windows的计划任务面板,新建一个任务,其中关键的一步叫“操作”的步骤的详细配置截图如下:

WSL和VirtualBox的定时备份脚本最后的自动定时备份的效果以wsl为例如下:

WSL和VirtualBox的定时备份脚本

最后说一下,上述的wsl备份脚本只适用于win10自带的wsl,在win11的新版wsl里面会报错,目前原因未知。