Closed5

Git BashでWSL2のVHDXのパスを取得したい

gn5rgn5r

取り合えず動くもの

vhdx
#!/usr/bin/bash

set -e

function getPath() {
  local cmd="(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { \$_.GetValue(\"DistributionName\") -eq '$1' }).GetValue(\"BasePath\") + \"\ext4.vhdx\""
  path=$(powershell -c "$cmd")
  echo "$1 ${path#\\\\\?\\}"
}

destros=$(wsl -l -q | tr -d "\0")

for d in $destros; do
  getPath "$(echo ${d%%[\r\n]+})"
done
gn5rgn5r

実行結果

$ vhdx
Ubuntu C:\Users\gn5r\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
docker-desktop-data C:\Users\gn5r\AppData\Local\Docker\wsl\data\ext4.vhdx
docker-desktop C:\Users\gn5r\AppData\Local\Docker\wsl\main\ext4.vhdx
Ubuntu-22.04 C:\Users\gn5r\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
gn5rgn5r

grepなんかもできる

$ vhdx | grep 'Ubuntu'
Ubuntu C:\Users\gn5r\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
Ubuntu-22.04 C:\Users\gn5r\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
gn5rgn5r

一応awkを使うことも考慮してある

$ vhdx | grep 'Ubuntu' | awk '{print $2}'
C:\Users\gn5r\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
C:\Users\gn5r\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
gn5rgn5r

解説

destros=$(wsl -l -q | tr -d "\0")

for d in $destros; do
  getPath "$(echo ${d%%[\r\n]+})"
done

wsl -l -qの結果にはWindowsの改行コードが含まれているため"$(echo ${d%%[\r\n]+})"で消す必要がある

function getPath() {
  local cmd="(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { \$_.GetValue(\"DistributionName\") -eq '$1' }).GetValue(\"BasePath\") + \"\ext4.vhdx\""
  path=$(powershell -c "$cmd")
  echo "$1 ${path#\\\\\?\\}"
}

docker-desktop-dataなどのvhdxのパスを取得すると以下のように先頭に\\?\が付与されるのでそれを消している
\\?\C:\Users\gn5r\AppData\Local\Docker\wsl\data\ext4.vhdx

このスクラップは4ヶ月前にクローズされました