Last active
November 13, 2023 16:45
-
-
Save elonzh/38d104e60fee8c638f935d049d5969c3 to your computer and use it in GitHub Desktop.
Invoke-Expression (Invoke-WebRequest -Uri "<gist url>").Content && Move-WSL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <# | |
| .SYNOPSIS | |
| Migrate a specified WSL (Windows Subsystem for Linux) distribution to a new location. | |
| .DESCRIPTION | |
| The Move-WSL function terminates, exports, unregisters, and re-imports a specified WSL distribution to a new location. This is useful for moving the distribution to a different drive or directory. | |
| .PARAMETER Distro | |
| The name of the WSL distribution that you want to move. This parameter is mandatory. | |
| .PARAMETER Location | |
| The target directory where the WSL distribution will be moved. This parameter is mandatory. | |
| .EXAMPLE | |
| Move-WSL -Distro Ubuntu -Location D:\WSL | |
| Moves the 'Ubuntu' WSL distribution to the 'D:\WSL' directory. | |
| .OUTPUTS | |
| Outputs the path where the WSL distribution is exported. | |
| .NOTES | |
| Ensure that the specified location has enough space for the WSL distribution. The function might fail if there's insufficient space. | |
| .LINK | |
| For more information about WSL commands, visit: https://docs.microsoft.com/en-us/windows/wsl/reference | |
| Reference: | |
| - https://superuser.com/a/1732559/1114962 | |
| - https://github.com/microsoft/WSL/issues/4482#issuecomment-1025130239 | |
| #> | |
| function Move-WSL { | |
| [CmdletBinding()] | |
| param( | |
| [Parameter(Mandatory=$true)] | |
| [string]$Distro, | |
| [Parameter(Mandatory=$true)] | |
| [string]$Location | |
| ) | |
| try { | |
| # Terminate the specified WSL distribution | |
| wsl --terminate $Distro | |
| if ($LASTEXITCODE -ne 0) { throw "Failed to terminate WSL distribution: $Distro" } | |
| # Construct the file path | |
| $filePath = Join-Path $Location "$Distro.vhdx" | |
| # Export the WSL distribution | |
| wsl --export $Distro $filePath --vhd | |
| if ($LASTEXITCODE -ne 0) { throw "Failed to export WSL distribution: $Distro" } | |
| # Unregister the WSL distribution | |
| wsl --unregister $Distro | |
| if ($LASTEXITCODE -ne 0) { throw "Failed to unregister WSL distribution: $Distro" } | |
| # Import the WSL distribution in place | |
| wsl --import-in-place $Distro $filePath | |
| if ($LASTEXITCODE -ne 0) { throw "Failed to import WSL distribution: $Distro" } | |
| # Output the file path | |
| Write-Output "WSL distribution $Distro has been moved to $filePath" | |
| Write-Output "Moving distribution may change the default user. To use your own account, run 'ubuntu config --default-user <yourname>' or config the default user in /etc/wsl.conf according to https://learn.microsoft.com/en-us/windows/wsl/wsl-config#user-settings." | |
| } | |
| catch { | |
| Write-Error "An error occurred: $_" | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment