WSL2を少しだけ快適にするTips

TL;DR

WSL2はとても使いやすく快適なのですが、たまにこれできるとすごく快適になるのに、ということがあると思います。解決できるたびに追記していきたいです。

基本

exeファイル

WSL2ではWindows上のexeファイルが使えます。使えるexeファイルは色々ありますが、使ったことがあるものをまとめます。

コマンド用途
cmd.exeコマンドプロンプト
powershell.exePowershell
clip.execlipboard
explorer.exeエクスプローラー
notepad.exeメモ帳
write.exeワードパッド

コマンドプロンプトやPowershellを使うことで、WSL2側とWindows側をつなげることが可能です。また、clip.exeを使えば、クリップボードに文字列をコピーしたいときとかに便利です。

wslpathコマンド

WSL2のパスはWindows側とは違った形態なので、こういったexeファイルを使う際にはWindows側が解釈できる形に加工する必要があります。

これは、wslpathコマンドを使うと簡単です。以下のような感じのコマンドです。 デフォルトだと、windowsのパスをWSLパスに加工するのですが、WSL側では逆がしたいことがほとんどなので、wslpath -awをつけることになると思います。絶対パスに変換するのは安心感があるからです。

wslpath
Usage:
    -a    force result to absolute path format
    -u    translate from a Windows path to a WSL path (default)
    -w    translate from a WSL path to a Windows path
    -m    translate from a WSL path to a Windows path, with '/' instead of '\'

EX: wslpath 'c:\users'

WSL2かどうかを判別する

dotfileの設定などの際にWSL2上かどうかを判定したいことがあります。

自分は以下のように判定しています。

if [[ $(uname -r) == *'microsoft'* ]]; then
    echo WSL2
fi

実際の用途

openコマンド

Macを使用している方には通じると思うのですが、ファイルを規定のアプリで開いてくれるコマンドです。WSL2では以下のような形で実現できます。

cmd.exe /c start $(wslpath -aw $file)

Explorerで開きたい場合は、

explorer.exe $(wslpath -aw $file)

clipboardに文字列をコピー

clip.exeにパイプで文字列を流せばいいです。

echo "hello" | clip.exe

clipboardに画像をコピー

トリッキーなことをします。powershell.exeの引数にPowershellスクリプトを流せば実行してくれます。以下のps1ファイルを適当な名前で作成します。

imgcopy.ps1

[Reflection.Assembly]::LoadWithPartialName('System.Drawing');
[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');

$filename = $Args[0];
$file = get-item($filename);
$img = [System.Drawing.Image]::Fromfile($file);
[System.Windows.Forms.Clipboard]::SetImage($img);
powershell.exe "./imgcopy.ps1 image.png"

clipboardの画像を貼り付け

powershellのGet-Clipboardを使えば実現可能です。

powershell.exe "(Get-Clipboard -Format Image).Save('image.png')"

参考

この記事に関するIssueをGithubで作成する

Read Next