阅读 WSL 文档和 Windows 命令行文档wsl.exe
,我没有找到任何从 Windows 命令行获取 WSL 发行版大小的方法。
我知道从发行版命令行本身 cf 很容易这里,但是如何从Wndows命令行获取它?
答案1
找到分发的路径并在资源管理器中查看它当然是最简单的,但对于纯粹的命令行方法,这就是您所要求的......
从 Windows PowerShell 或 PowerShell Core:
Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" -Recurse |
ForEach-Object {
$distro_name = ($_ | Get-ItemProperty -Name DistributionName).DistributionName
$distro_dir = ($_ | Get-ItemProperty -Name BasePath).BasePath
$distro_dir = Switch ($PSVersionTable.PSEdition) {
"Core" {
$distro_dir -replace '^\\\\\?\\',''
}
"Desktop" {
if ($distro_dir.StartsWith('\\?\')) {
$distro_dir
} else {
'\\?\' + $distro_dir
}
}
}
Write-Output "------------------------------"
Write-Output "Distribution: $distro_name"
Write-Output "Directory: $($distro_dir -replace '\\\\\?\\','')"
$distro_size = "{0:N0} MB" -f ((Get-ChildItem -Recurse -LiteralPath "$distro_dir" | Measure-Object -Property Length -sum).sum / 1Mb)
Write-Output "Size: $distro_size"
}
将报告每个 WSL 分发的名称、目录和大小。
解释:
- 解析 WSL 发行版的注册表项以检索其名称和基目录
- 某些 WSL 发行版(我认为是用 创建的
wsl --import
)的目录名称以 开头\\?\
,这是 Windows 长路径前缀。这是有问题的,因为 Windows PowerShell 和 PowerShell Core 对这些路径的处理方式不同。脚本中的if
和switch
条件(以及-replace
)是为了使其在两个版本上都能正常工作。 - 一旦我们有了一致的目录名(适用于所有平台上的长路径),我们就可以递归它们并使用 PowerShell 的
Measure-Object
cmdlet 计算所有文件的大小总和。 - 这将适用于 WSL1(其中 Linux 文件直接存储在文件系统上)和 WSL2(其中文件位于虚拟驱动器中)。
边注:
我知道从发行版命令行本身来看这很容易
不是。您链接的答案是在 WSL2 发布之前写的。它适用于 WSL1,但 WSL2 发行版存储在 Windows .vhdx
(虚拟磁盘)中,成长根据需要,但没有收缩当其中的文件被删除时。
因此,对于 WSL2,类似的东西ncdu
(来自您链接的问题)将仅报告分布的大小想正在使用。Windows 驱动器上的虚拟磁盘的实际大小可能会更大(有时会大得多)。