nazo6 notememo

ドライブを自動でwslにマウントするスクリプト

作成:2024/08/23

更新:2024/08/23

wslでは
mount -t drvfs X: /mnt/X
というコマンドを使うことでドライブをマウントできるが、接続するたびに自動でやってほしかったのでスクリプトを作れないかと思っていたところドンピシャなコードを見つけた。

Is there a way to mount an external drive when it becomes available in WSL?

I am using Ubuntu with WSL with a zsh/bash shell. My host OS is Windows 10. I already figured out how to mount a Windows external drive: sudo mkdir /mnt/d sudo mount -t drvfs D: /mnt/d I rarely plug

superuser.com

これを少し改変させてもらって以下のようなスクリプトを作成した。
$query = "select * from __InstanceCreationEvent within 5 where TargetInstance ISA 'Win32_LogicalDisk'"

$dt = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
Set-Content ./log.txt "$dt wsl automount start"

Register-WmiEvent -Query $Query -SourceIdentifier USBFlashDriveWSLMount


While ($True) {
$event = Wait-Event -SourceIdentifier USBFlashDriveWSLMount
$drivePath = $event.SourceEventArgs.NewEvent.TargetInstance.Name
$driveLetter = $drivePath.ToLower()[0]
$dt = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
if (((wsl -l -v) -replace "`0" | Select-String -Pattern Run) -ne $null) {
Add-Content ./log.txt "$dt wsl mounting: $driveLetter $drivePath"
echo "$dt wsl mounting: $driveLetter $drivePath"
wsl -u root -e mount -t drvfs $drivePath /mnt/$driveLetter
} else {
Add-Content ./log.txt "$dt wsl mount skipped: $driveLetter $drivePath"
echo "$dt wsl mount skipped: $driveLetter $drivePath"
}
Remove-Event USBFlashDriveWSLMount
}

$dt = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
Add-Content ./log.txt "$dt wsl automount stop"

ちなみに、wslコマンドの出力はUTF-16だからそのままだとSelect-Stringできないらしい。

How do I match on wsl output in powershell?

I want to see if I'm running a particular wsl distribution (Windows 10 Home, WSL 2): PS C:\Users\User> wsl --list --running Windows Subsystem for Linux Distributions: Ubuntu (Default) MyDistro P...

stackoverflow.com

あとはこれをタスクスケジューラで実行するだけだが、このままだとウインドウが出てしまう。
これを回避するにはVBSスクリプトを作るなどの方法があるが、このためのユーティリティを前作ったのを思い出した。

GitHub - nazo6/hide-start

Contribute to nazo6/hide-start development by creating an account on GitHub.

github.com

これは実行ファイル名.tomlというファイルに指定されたコマンドを実行するという簡単なプログラムで、今回は
automount-hide-start.toml
cmd = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -File automount.ps1"
wait = true
というtomlファイルを作ってautomount-hide-start.exeをタスクスケジューラに指定した。あと開始ディレクトリの指定も忘れずに。
スクリプト実行後はwslで/mnt/x/にマウントされるようになる。