Как я могу «открыть» файл из WSL с помощью приложения по умолчанию?


12

Большинство систем предоставляют openкоманду (также известную как start, cygstartи xdg-openт. Д.), Которая открывает файл в приложении «по умолчанию» среды рабочего стола, что бы это ни было.

Например, из Powershell, когда я вхожу:

PS> start form.pdf

Документ открывается в Edge.

Может ли Bash-on-Ubuntu-on-Windows сделать это?

Ответы:


29

Так как взаимодействие Windows Linux начало работать, теперь вы можете позвонить:

cmd.exe /C start <file>

У меня работает для относительных путей, для абсолютных путей я написал скрипт для замены / mnt / c на c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael

1
Хорошее решение. Мы также можем получить доступ к файлам в файловой системе Linux, используя информацию с superuser.com/q/1110974/66714 . Нечто подобное cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Теперь мы готовим на огне!
Cheezmeister

2

Это зависит от того, хотите ли вы A) запустить программу linux внутри WSL или B) вы хотите запустить программу windows из командной строки bash.

Если Б), то да, если вы устанавливаете Cygwin / Bash. Например, установите Git для Windows, и у вас есть система, работающая под Windows с Bash. Затем вы можете просто запустить 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, вам нужно будет связать приложение Linux с графическим интерфейсом, чтобы открыть PDF-файл.

Обратите внимание, что в WSL вы выполняете исполняемые файлы Linux, а не Windows:

(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

Как отметил Мартин, это правильный способ запуска / открытия приложения / файла Windows.

cmd.exe /C start <file>

Я нашел очень полезным преобразовать это в скрипт bash, который я храню в папке, которая находится в моем системном пути. Я называю это startи делаю chmod 0744с файлом, чтобы сделать его исполняемым. В $*означает , что он будет проходить все аргументы командной строки , которую вы предоставили в скрипт cmd.exe.

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

С помощью этой команды в моем системном пути я могу использовать такие команды в Linux, которые открываются в Windows:

  1. start FileXYZ.pdf // Открывает PDF в программе просмотра PDF, назначенной по умолчанию в Windows
  2. start explorer . // Открывает текущую папку WSL в проводнике Windows
  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 может открывать различные файлы (каталоги и URI) в WSL.

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-Processкоманду powershell из WSL:

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 очень хорошо работает для поиска правильного разрешенного пути (даже для подключенных сетевых каталогов) и запуска инструмента по умолчанию. Единственный недостаток в том, что у вас не может быть путей в имени файла, поэтому вам нужно создать небольшую вспомогательную функцию / скрипт для корректного запуска проводника, например:

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 непосредственно по пути (после преобразования). Тогда вышеприведенная функция становится тривиальной и легко может быть сделана псевдонимом.


Отличное решение!
Конюшня

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.