Як я можу "відкрити" файл із WSL за допомогою програми за замовчуванням?


13

Більшість систем надають openкоманду (поперемінно відому як start, cygstartі xdg-openт. Д.), Яка відкриває файл у додатку "за замовчуванням" на робочому середовищі, як би це не було.

Наприклад, з Powershell, коли я ввожу:

PS> start form.pdf

Документ вискакує в Edge.

Чи може це зробити Bash-on-Ubuntu-on-Windows?

Відповіді:


30

Оскільки інтероп Windows Linux почав працювати, тепер ви можете телефонувати:

cmd.exe /C start <file>

Для мене працює для відносних шляхів, для абсолютних шляхів я написав сценарій на заміну / mnt / c на c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Майкл

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

3

Як зазначив Мартійн, це правильний спосіб виконання / відкриття програми / файла 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. Я оновив сценарій, щоб впоратися з цим.
pseudosavant

Назви файлів Linux з пробілами зазвичай обробляються з накидами на зразок a\ whitespace.pdf. Як запустити сценарій, як start.sh a\ a.pdf b\ b.pdfби, не вийшло.
0x7d7b

explorer.exe .відкриває поточний шлях у Windows Explorer
Джонні

2

Це залежить від того, чи потрібно A) запустити програму Linux всередині WSL або B), яку ви хочете запустити програму Windows з запиту bash shell.

Якщо B), то так, якщо встановити cygwin / bash. Наприклад, встановіть git для windows, і у вас є система, що працює під windows з bash. Тоді ви можете просто запустити старт, насправді він включений як сценарій:

$ 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 у вікні графічного інтерфейсу. Зауважте, що 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

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")
}

Оновлення: Нго вказав на інший скрипт, wslpathякий робить конверсію шляху, тому ви можете викликати explorer.exe безпосередньо на шляху (після перетворення). Тоді функція вище стає тривіальною і її легко можна зробити псевдонімом.


Відмінне рішення!
Stabledog

1

щоб розширити відповідь Мартійна, можна поставити

alias start='cmd.exe /C start'

у вашому .bashrc, щоб отримати очікувану поведінку Windows, наприклад, start .відкриває Explorer у поточному режимі.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.