如何从 Windows 命令行获取 WSL 分发大小?

如何从 Windows 命令行获取 WSL 分发大小?

阅读 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 对这些路径的处理方式不同。脚本中的ifswitch条件(以及-replace)是为了使其在两个版本上都能正常工作。
  • 一旦我们有了一致的目录名(适用于所有平台上的长路径),我们就可以递归它们并使用 PowerShell 的Measure-Objectcmdlet 计算所有文件的大小总和。
  • 这将适用于 WSL1(其中 Linux 文件直接存储在文件系统上)和 WSL2(其中文件位于虚拟驱动器中)。

边注:

我知道从发行版命令行本身来看这很容易

不是。您链接的答案是在 WSL2 发布之前写的。它适用于 WSL1,但 WSL2 发行版存储在 Windows .vhdx(虚拟磁盘)中,成长根据需要,但没有收缩当其中的文件被删除时。

因此,对于 WSL2,类似的东西ncdu(来自您链接的问题)将仅报告分布的大小正在使用。Windows 驱动器上的虚拟磁盘的实际大小可能会更大(有时会大得多)。

相关内容