backup-wsl.psm1
$ModuleName="Backup-WSL" $env:WSL_UTF8=1 Function Backup-WSL(){ <# .SYNOPSIS Backup //wsl.localhost/DISTRO/USERNAME/SUBDIR to %USERPROFILE%/OneDrive/Documents/SUBDIR with robocopy . set $ENV:BACKUP_WSL_SUBDIR to specify the subdir .DESCRIPTION Backup //wsl.localhost/DISTRO/USERNAME/SUBDIR to %USERPROFILE%/OneDrive/Documents/SUBDIR with robocopy . set $ENV:BACKUP_WSL_SUBDIR to specify the subdir .EXAMPLE Backup-WSL .EXAMPLE # full command to trigger from .bat or Scheduled Task pwsh -C "Import-Module $HOME\scripts\backup-wsl && Backup-WSL" .OUTPUTS see %USERPROFILE%\backup-wsl.log.txt #> $logfile="$HOME\backup-wsl.log.txt" if ((Get-Item $logfile).length -gt 1280000){ Remove-Item $logfile } $subDir = [string]($env:BACKUP_WSL_SUBDIR ?? "sotion") $wslUser=[string](wsl whoami) $wslDistro=[string](wsl --list -q | Select-Object -first 1) if ($LASTEXITCODE -ne 0){ $message = "wsl command missing" Write-EventLog -LogName Application -Source "Backup-WSL" -EventID 3001 -Message $message exit } $src=[string](Join-Path "\\wsl.localhost" $wslDistro "home" $wslUser $subDir) $dest=[string](Join-Path ${env:OneDrive} "Documents\${subDir}") Write-EventLog -LogName Application -Source "Backup-WSL" -EventID 3001 -Message "Starting Backup" $t0=(Get-Date) $roboOptions = @( '/W:1','/R:0', '/E', '/xd', 'node_modules' , '/NFL', "/LOG+:${logfile}") robocopy $src $dest $roboOptions $exitcoderobo=$LASTEXITCODE $t1=(Get-Date) $delta =($t1-$t0) $message="Finished Backup. Duration = $delta" if($exitcoderobo -ne 0){ $message="ERROR: Finished Backup. Backup failed. Duration = $delta . Check $logfile for error" } Write-EventLog -LogName Application -Source "Backup-WSL" -EventID 3001 -Message $message exit $exitcoderobo } Function Install-BackupWSL{ <# .SYNOPSIS Install scheduled task 2pm daily .DESCRIPTION Install scheduled task 2pm daily .EXAMPLE Install-BackupWSL .OUTPUTS None #> $time = New-ScheduledTaskTrigger -Daily -At 2pm $user = (whoami) $action = New-ScheduledTaskAction -Execute "${env:ProgramFiles}\PowerShell\7\pwsh.exe"` -Argument "-noninteractive -nologo -noprofile` -C `"Import-Module $HOME\scripts\backup-wsl && Backup-WSL`"" Register-ScheduledTask -TaskName "Backup-WSL" -Trigger $Time -User $User -Action $action } Function Get-BackupWSLEvent { <# .SYNOPSIS Lists latest BackupWSL events from Windows Event Log .DESCRIPTION Lists latest BackupWSL events from Windows Event Log .EXAMPLE Get-BackupWSLEvent .OUTPUTS System.Diagnostics.EventLogEntry #> Get-EventLog -LogName Application -Source $ModuleName } Function Build-BackupWSLSignature { $cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1 "backup-wsl.psd1","backup-wsl.psm1" | Foreach-Object { Set-AuthenticodeSignature -File $_ -Certificate $cert } } # SIG # Begin signature block # MIIFuQYJKoZIhvcNAQcCoIIFqjCCBaYCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAnMiyx629woI7x # 1mLSDXmREtFkTRIkunVWlVN2jc68wqCCAyIwggMeMIICBqADAgECAhA8Azq0Wr3+ # pEKieGfMmIkiMA0GCSqGSIb3DQEBCwUAMCcxJTAjBgNVBAMMHFBvd2VyU2hlbGwg # Q29kZSBTaWduaW5nIENlcnQwHhcNMjQwMzI5MjE1NTI0WhcNMjUwMzI5MjIxNTI0 # WjAnMSUwIwYDVQQDDBxQb3dlclNoZWxsIENvZGUgU2lnbmluZyBDZXJ0MIIBIjAN # BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA22r/jGspQfAjlNK1WG+vzr08YI7J # oyY22hYZcgsmKvktxaoY8AARwQK1dTy9lRB3RPG9LARN3D8c/77dJwQV+U7fHQVc # Wqi8YMsrXYbr/uYWYRiZXdWjYgOaY+jeCcvytvmPGpkVklp5wf8a6wfaUTJuaRe9 # MaJR84KoY4LmyMFpuKf1yX/T3W2H2rjCufha/RqR+I2PdV6onB6+1s+coaEJRt/A # 4wmzeOBg8xbpIcHRFVwz4JjKPNd62ZdClnGsYepJ1YS+EDmX8nL2Xb1JZ0V+QzTd # k5PZLgMLq88A1VAkJrvUOWT8cNddxiKJ9Ca0J+tUgafYpwC52YQaEaAlNQIDAQAB # o0YwRDAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHQYDVR0O # BBYEFN/W6W2WQ86WApKXJzjgsw14OgpbMA0GCSqGSIb3DQEBCwUAA4IBAQByATpz # KPYyk+NSoOesHIX0oD3RYRBpth0A/ASej+R/aY649DeB6/6LvPGY5O2ap0+niA5w # lB3HViXCVcDiDSzdzwnqWOeRXBqCRo4vqhspXp/sv1tCKtfN4MMVGGdOOG2NO5Pn # MY93j9yX5zwIzXTF17QL01fpVECf5tDCtKZ6iomWzEqlz9Kbh1f1bSNnqzDlEZyp # H62dtstbbv/r1qu4+G+Z4NSSs2YtHDWXDTAlg2VC0T3aAo+0f50Chf9zDTC/OUFd # 4F7VXvyBow9QJKa5F/aTQW6a7/rJaYDLaB2eKJfN8ML+TtIjI2x4kzPyBaSnnIFz # 9hrzdvgl+EGGjcKiMYIB7TCCAekCAQEwOzAnMSUwIwYDVQQDDBxQb3dlclNoZWxs # IENvZGUgU2lnbmluZyBDZXJ0AhA8Azq0Wr3+pEKieGfMmIkiMA0GCWCGSAFlAwQC # AQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwG # CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZI # hvcNAQkEMSIEIKAvWlDTRN5AG0fpsixLZT9adi3yYYlsWpeQbraKPaRdMA0GCSqG # SIb3DQEBAQUABIIBAGUMGo8IFGbhKUvOFkuv2vmGRyTlQngmhxsvgEH2jCLJqMTU # OF92OBNrSKN3GZrEpkXFN5MtP2vJJw8acRkQh81hvjJysV8DCYI00idJxh2zIlcN # /MoqVawUsmAQSSPpEef7LquQl2wx76JQfMni185VINQIPkPCsmG+ErFljU7KTMZ6 # uSOZuYEdNNBjB98C77Rod+rXY8JM1Oihbo3FbEM6UYDGOXLqqKphnkt9LVHOPj3a # ZtEj3Upxf+bURrVq8TUOot/d6zwsgDBZtubnIjE0tDnstBwwXpVEkiY3f8BG2bKo # Uh5KKAmMe6COKgxNg8ZJBDJYZqpZv/bfoMuVUtM= # SIG # End signature block |