🙄

wsl2からPDFとExcelを開く

2023/12/28に公開

【背景】

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

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

【EdgeとExcelの起動方法】

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

<Microsoft Edgeの起動>

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

<Excelの起動>

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

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

 cmd.exe /c start msedge
cmd.exe /c start excel

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

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

【EdgeからPDFを開く】

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

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

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

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

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というファイルを開く。

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

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

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

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

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

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

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

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

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

 # 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)を作成する。
# 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ファイルを開くことが出来る様になります。

Discussion