wsl2からPDFとExcelを開く

## 【背景】

最近、wsl2上で作業することが多く、いちいちexplorerを開くのが面倒になったので、wsl上からPDFやExcelを開く方法がないかと調べました。

ちなみにPDFはEdgeで開くことを想定してます。

## 【EdgeとExcelの起動方法】

- Windowsのバージョン2004（ビルド番号19041）以降から、WSL2から直接Windowsの実行ファイルを起動できるようになりました。
- wls2から直接実行ファイルを開くことで、アプリを起動することが出来ます。
- これらのコマンドを実行する際には、実行ファイルのパスにスペースが含まれる場合はバックスラッシュ`\\`でエスケープするか、クォート`"`で囲む必要となります。

### ＜Microsoft Edgeの起動＞

```bash
/mnt/c/Program\\ Files\\ \\(x86\\)/Microsoft/Edge/Application/msedge.exe
```

### ＜Excelの起動＞

```bash
/mnt/c/Program\\ Files\\ \\(x86\\)/Microsoft\\ Office/root/Office16/EXCEL.EXE
```

また、WSL2からWindowsアプリを起動する際には、`cmd.exe`や`powershell.exe`を介してコマンドを実行することもで可能です。

```bash
 cmd.exe /c start msedge
```

```bash
cmd.exe /c start excel
```

`start`コマンドは、アプリケーションの名前を指定するだけで関連付けられた実行ファイルを起動することができるWindowsのコマンドです。

これを使用すると、パスを具体的に指定する必要がなくなります。

## 【EdgeからPDFを開く】

- `cmd.exe /c start msedge`を使用してPDFを開く。
- そのさい、引数にPDFファイルのパスを追加する必要があります。

例）Windowsのデスクトップにある`example.pdf`というファイルを開く。

```bash
cmd.exe /c start msedge "C:\Users\{YourUserName}\Desktop\example.pdf"
```

但し、これはWindowsスタイルのパスであるため、WSL2で起動するためにLinuxスタイルのパスで実行する必要があります。

```bash
cmd.exe /c start msedge "/mnt/c/Users/{YourUserName}/Desktop/example.pdf"
```

※`{YourUserName}`は自身のWindowsのユーザー名に置き換えてください。

## 【Excelファイルを開く】

- `cmd.exe /c start excel`を使用してExcelファイルを開く。
- この場合も同様に、引数にExcelファイルのパスを追加する必要がある。

例）Windowsのデスクトップにある`example.xlsx`というファイルを開く。

```bash
cmd.exe /c start excel "/mnt/c/Users/{YourUserName}/Desktop/example.xlsx"
```

※`{YourUserName}`は自身のWindowsのユーザー名に置き換えてください。

## 【フォルダパスにスペースが入っている場合】

パスにスペースが含まれている場合、`cmd.exe`の`start`コマンドはパスを正しく解釈できないことがあります。

これを解決するには、パスをダブルクォーテーションで囲む必要があります。

しかし、`start`コマンドは最初のダブルクォーテーションで囲まれた引数を「タイトル」として解釈するため、コマンドにダミーのタイトルを追加することが一般的な解決策です。

```bash
 cmd.exe /c start "" "C:\\Path To\\Your File.pdf"
```

上記のコマンドで、最初のセットのダブルクォーテーションはダミーのタイトルとして機能し（ここでは空にしています）、次のダブルクォーテーションで囲まれた部分がファイルのパスになります。これにより、`start`コマンドはスペースを含むパスも正しく処理します。

また、WSL2から実行する場合は、WindowsのパスをWSL2形式からWindows形式に変換する必要があります。以下の例では、WSL2のパスを`wslpath`コマンドを使用して変換しています。

```bash
 # WSL2のパスをWindows形式に変換
 windows_path=$(wslpath -w '/mnt/c/Path To/Your File.pdf')

 # PDFをMicrosoft Edgeで開く
 cmd.exe /c start "" $windows_path
```

これらのコマンドをFishシェルの`~/.bashrc`に追加するか、スクリプトとして保存して実行することができます。

## 【.bashrcに記載して使用できるようにする】

これまでの内容を使って、`~/.bashrc`にWSL2から実行可能なスクリプトを作成します。

- 関数として作成する。
- 関数を呼び出すショートカット（alias）を作成する。

```bash
# open-excel (only windows)
 open-excel() {
     current_dir=$(pwd)
     if [ "$1" != "" ]; then
         file_path_win=$(wslpath -w "$current_dir/$1")
         cmd.exe /c start excel "" "$file_path_win"
     fi
 }
 
 # open-pdf (only windows)
 open-pdf() {
    current_dir=$(pwd)
    if [ "$1" != "" ]; then
        file_path_win=$(wslpath -w "$current_dir/$1")
        cmd.exe /c start msedge "" "$file_path_win"
    fi
 }
 
 # open-dir (only windows)
  open-dir() {
      current_dir=$(pwd)
      file_path_win=$(wslpath -w "$current_dir/")
      explorer.exe $file_path_win
  }

# ショートカット
alias xls='open-excel'
alias pdf='open-pdf'
alias open='open-dir'
```

※私の環境では、動作確認済みのスクリプトです。

※使えるようにするには、再度WLS2を起動するか、`source ~/.bashrc`を実行する必要があります。

これで、Excelを開く際は`xls "{ファイル名}"`で、PDFを開く際は`pdf “{ファイル名}”`で開くことが出来ます。

ちなみに`open`は、おまけでカレントディレクトリをexplorerで開くコマンドです。

このように、スクリプトを作成することでWLS2からでもWindowsのGUI上でExcelファイルやPDFファイルを開くことが出来る様になります。