wslでは
というコマンドを使うことでドライブをマウントできるが、接続するたびに自動でやってほしかったのでスクリプトを作れないかと思っていたところドンピシャなコードを見つけた。
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
できないらしい。
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/
にマウントされるようになる。