Jak mogę „otworzyć” plik z WSL przy użyciu domyślnej aplikacji?


12

Większość systemów zapewnienia openpolecenia (na przemian znany jako start, cygstart, xdg-openitd.), Który otwiera plik w „default” aplikacji środowiska graficznego użytkownika, cokolwiek to znaczy.

Na przykład z Powershell, gdy wprowadzam:

PS> start form.pdf

Dokument otworzy się w Edge.

Czy Bash-on-Ubuntu-on-Windows może to zrobić?

Odpowiedzi:


29

Ponieważ interop systemu Windows Linux zaczął działać, możesz teraz dzwonić:

cmd.exe /C start <file>

Działa dla mnie dla ścieżek względnych, dla ścieżek bezwzględnych napisałem skrypt, który zastąpi / mnt / c przez c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael

1
Niezłe rozwiązanie. Możemy również uzyskać dostęp do plików w systemie plików Linux za pomocą informacji z superuser.com/q/1110974/66714 . Coś w stylu cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Teraz gotujemy z ogniem!
Cheezmeister,

2

Zależy to od tego, czy chcesz A) uruchomić program Linux w WSL, czy B) chcesz uruchomić program Windows z wiersza poleceń powłoki bash.

Jeśli B), to tak, jeśli zainstalujesz cygwin / bash. Na przykład zainstaluj git dla Windows i masz system działający pod Windows z bash. Następnie możesz po prostu uruchomić start, w rzeczywistości jest on zawarty jako skrypt:

$ 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 "${@//&/^&}"

Jeśli A), to staje się znacznie trudniejsze, szczególnie jeśli chcesz uruchomić program Linux, aby wyświetlić plik .pdf w oknie GUI. Zauważ, że Windows wie, że może skojarzyć domyślną aplikację do otwierania pliku pdf, ale WSL nie ma tych informacji. Więc nawet jeśli masz pulpit działający pod WSL , musisz powiązać aplikację GUI z Linuksem, aby otworzyć pdf.

Uwaga, aby wyjaśnić, w WSL wykonujesz pliki wykonywalne Linuksa, a nie pliki wykonywalne systemu 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

Jak zauważył Martijn, jest to właściwy sposób na uruchomienie / otwarcie aplikacji / pliku Windows.

cmd.exe /C start <file>

Przekonałem się, że bardzo przydatne jest przekształcenie tego w skrypt bash, który trzymam w folderze, który znajduje się w mojej ścieżce systemowej. Nazywam go starti robię chmod 0744z plikiem, aby był wykonywalny. Te $*środki to przejdzie wszystkie argumenty wiersza poleceń ty dostarczonych do skryptu cmd.exe.

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

Za pomocą tego polecenia w ścieżce systemowej mogę wykonywać takie polecenia w systemie Linux, które otwierają się w systemie Windows:

  1. start FileXYZ.pdf // Otwiera plik PDF w domyślnie przypisanej przeglądarce plików PDF w systemie Windows
  2. start explorer . // Otwiera bieżący folder WSL w Eksploratorze Windows
  3. start MyApp.exe // Uruchamia aplikację Windows

1
Jedynym problemem jest to, że to rozwiązanie nie działa z plikami, które mają w nazwie białe znaki.
0x7d7b,

@ h3nrik Świetny punkt. Chyba nie otwieram wielu plików ze spacjami w systemie Linux. Zaktualizowałem skrypt, aby go obsłużyć.
pseudosavant

W systemie Linux nazwy plików z białymi spacjami są zwykle obsługiwane za pomocą ukośników odwrotnych, takich jak a\ whitespace.pdf. Uruchomienie skryptu tak jak start.sh a\ a.pdf b\ b.pdfby nie działało.
0x7d7b,

explorer.exe .otwiera bieżącą ścieżkę w Eksploratorze Windows
John

1

eopen może otwierać różne pliki (, katalogi i URI) w WSL.

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

Przykłady

# 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

To działało dla mnie znacznie lepiej:

explorer.exe `wslpath -aw <path>`

1

Możesz wywołać Start-Processpolecenie powershell z poziomu WSL:

powershell.exe -Command Start-Process file

Aby działało to również ze ścieżkami bezwzględnymi, możesz użyć wslpath -wapolecenia, aby przetłumaczyć ścieżkę na ścieżkę systemu Windows.

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

Ma to przewagę nad cmd.exerozwiązaniem: dla zamontowanych udziałów sieciowych wslpathtworzy ścieżkę UNC jak \\server\share\. Te ścieżki UNC nie mogą być obsługiwane cmd.exe.


1

Przekonałem się, że explorer.exe działa całkiem dobrze w znalezieniu poprawnej ścieżki (nawet w zamontowanych katalogach sieciowych) i uruchomieniu domyślnego narzędzia. Jedną z nich jest to, że nie możesz mieć ścieżek w nazwie pliku, więc musisz utworzyć małą funkcję pomocniczą / skrypt, aby poprawnie uruchomić eksploratora, np .:

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

Aktualizacja: Ngo wskazał inny skrypt, wslpathktóry dokonuje konwersji ścieżki, więc możesz wywołać explorer.exe bezpośrednio na ścieżce (po konwersji). Następnie powyższa funkcja staje się banalna i można ją łatwo zmienić na alias.


Doskonałe rozwiązanie!
Stabledog


0

aby rozwinąć odpowiedź Martijna, możesz umieścić

alias start='cmd.exe /C start'

w .bashrc, aby uzyskać oczekiwane zachowanie systemu Windows, np. start .otwiera eksploratora w bieżącym reż.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.