デフォルトのアプリケーションでWSLからファイルを「開く」にはどうすればよいですか?


12

ほとんどのシステムでは、提供open(交互として知られているコマンドstartcygstartxdg-openである何でもデスクトップ環境の「デフォルト」アプリケーションでファイルを開くなど)。

たとえば、Powershellから次のように入力すると、

PS> start form.pdf

ドキュメントがEdgeでポップアップ表示されます。

Bash-on-Ubuntu-on-Windowsはこれを実行できますか?

回答:


29

Windows Linuxの相互運用が機能し始めたので、次のように呼び出すことができます。

cmd.exe /C start <file>

絶対パスの相対パスの私の作品、私はcで代替の/ mnt / Cにスクリプトを書いた: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
マイケル・

1
素晴らしい解決策。superuser.com/q/1110974/66714からの情報を使用して、Linuxファイルシステム上のファイルにアクセスすることもできます。cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"火のように今調理しています!
Cheezmeister 2017年

2

これは、A)WSL内でLinuxプログラムを起動するか、B)bashシェルプロンプトからWindowsプログラムを起動するかによって異なります。

B)の場合、cygwin / bashをインストールすればはい。たとえば、Windowsにgitをインストールすると、bashを使用してWindowsでシステムが実行されます。次に、startを実行します。実際にはスクリプトとして含まれています。

$ cat /usr/bin/start
#!/usr/bin/env bash
# Copyright (C) 2014, Alexey Pavlov
#   mailto:alexpux@gmail.com
# This file is part of Minimal SYStem version 2.
#   https://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
# File: start

cmd //c start "${@//&/^&}"

A)の場合、特にLinuxプログラムを起動して.pdfをGUIウィンドウに表示する場合は、さらに困難になります。Windowsはデフォルトのアプリケーションを関連付けてPDFファイルを開くことを認識していますが、WSLには情報がありません。そのため、WSLでデスクトップを実行している場合でも、pdfを開くにはLinux GUIアプリを関連付ける必要があります。

明確にするために、WSL内では、Windows実行可能ファイルではなくLinux実行可能ファイルを実行します。

(WSL):~# file /bin/gzip
/bin/gzip: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=68cc3c090405cf6d40e97d2ff58085fd26940602, stripped

(WSL):~# file /mnt/c/Program\ Files/Internet\ Explorer/iexplore.exe
 /mnt/c/Program Files/Internet Explorer/iexplore.exe: PE32+ executable (GUI) x86-64, for MS Windows

(WSL):~# /mnt/c/Program\ Files/Internet\ Explorer/iexplore.exe
 bash: /mnt/c/Program Files/Internet Explorer/iexplore.exe: cannot execute binary file: Exec format error

2

Martijnが指摘したように、これはWindowsアプリケーション/ファイルを実行/開く正しい方法です。

cmd.exe /C start <file>

これをbashスクリプトに組み込んで、システムパス内のフォルダーに保存すると非常に便利です。私はそれを名前を付けstartてみませんかchmod 0744それが実行可能にするために、ファイルに。これ$*は、スクリプトに指定したすべてのコマンドライン引数をに渡すことを意味しcmd.exeます。

#!/bin/bash
cmd.exe /c start "Launching from BASH" "$*"

このコマンドをシステムパスに含めると、Windowsで開くLinuxで次のようなコマンドを実行できます。

  1. start FileXYZ.pdf // Windowsのデフォルトで割り当てられたPDFビューアでPDFを開きます
  2. start explorer . // Windowsエクスプローラで現在のWSLフォルダを開きます
  3. start MyApp.exe // Windowsアプリケーションを起動します

1
唯一の問題は、このソリューションが名前に空白を含むファイルでは機能しないことです。
0x7d7b

@ h3nrik素晴らしい点。Linuxではスペースのあるファイルをあまり開かないようです。それを処理するためにスクリプトを更新しました。
疑似サバント

Linuxでは、空白を含むファイル名は通常、のようなバックスラッシュで処理されますa\ whitespace.pdf。のようにスクリプトを開始してstart.sh a\ a.pdf b\ b.pdfも機能しません。
0x7d7b

explorer.exe .Windowsエクスプローラーで現在のパスを開きます
ジョニー

1

eopen WSL内のさまざまなファイル(、ディレクトリ、URI)を開くことができます。

https://github.com/ko1nksm/eopen-ecd

# Open directory with (latest used) Explorer
eopen ~/.config/

# Open directory with new instance of Explorer
eopen -n ~/.config/

# Opens with Windows default application
eopen image.png

# Opens with Windows text editor
eopen -e ~/.bashrc

# Use sudo to edit the unowned file
eopen -e --sudo /etc/hosts

# Opens with Windows default browser
eopen http://google.com

# Open files and directories under Windows
eopen C:/Windows

# Open files and directories under Network shared folder
eopen //server/shared

# Others
eopen mailto:user@example.com   # Mail protocol
eopen calculator:               # Application
eopen shell:Personal            # Shell commands
eopen :MyComputerFolder         # Shorthand for shell:
eopen shell:::{2559a1f8-21d7-11d4-bdaf-00c04f60b9f0} # CLSID
eopen :                         # Current Explorer location
eopen :/workspace               # Relative path from current Explorer location

1

これは私にとってはるかにうまくいきました:

explorer.exe `wslpath -aw <path>`

1

Start-ProcessWSL内からpowershellのコマンドを呼び出すことができます。

powershell.exe -Command Start-Process file

これを絶対パスでも機能させるには、wslpath -waコマンドを使用してパスをWindowsパスに変換します。

powershell.exe -Command Start-Process `wslpath -wa /absolute/path/to/file`

これは、cmd.exeソリューションよりも優れています。マウントされたネットワーク共有の場合、のwslpathようなUNCパスが生成されます\\server\share\。これらのUNCパスは、では処理できませんcmd.exe


1

explorer.exeは、正しい解決済みのパス(マウントされたネットワークディレクトリであっても)を見つけ、デフォルトのツールを起動するのに非常にうまく機能することがわかりました。1つ問題があるのは、ファイル名にパスを含めることができないため、エクスプローラーを正しく起動するための小さなヘルパー関数/スクリプトを作成する必要があることです。例:

win() { 
    # get full unsymlinked filename 
    file=`readlink -e $1` 
    dir=$(dirname "$file") 
    base=$(basename "$file") 
    # open item using default windows application 
    (cd "$dir"; explorer.exe "$base")
}

更新: Ngo wslpathは、パス変換を行う別のスクリプトを指摘したため、パス上で(変換後)explorer.exeを直接呼び出すことができます。その後、上記の関数は簡単になり、簡単にエイリアスにすることができます。


優れたソリューション!
ステーブルドッグ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.