Bagaimana saya bisa "membuka" file dari WSL dengan aplikasi default?


12

Kebanyakan sistem memberikan openperintah (bergantian dikenal sebagai start, cygstart, xdg-opendll) yang membuka file dalam "default" aplikasi lingkungan desktop, apa pun itu.

Misalnya, dari Powershell ketika saya memasukkan:

PS> start form.pdf

Dokumen muncul terbuka di Edge.

Bisakah Bash-on-Ubuntu-on-Windows melakukan ini?

Jawaban:


29

Sejak interop Windows Linux mulai bekerja sekarang Anda dapat menghubungi:

cmd.exe /C start <file>

Bekerja untuk saya untuk jalur relatif, untuk jalur absolut saya menulis naskah untuk menggantikan / mnt / c oleh c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael

1
Solusi yang bagus. Kami juga dapat mengakses file di sistem file Linux menggunakan info dari superuser.com/q/1110974/66714 . Sesuatu seperti cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Sekarang kita memasak dengan api!
Cheezmeister

2

Ini tergantung pada apakah Anda ingin A) meluncurkan program linux di dalam WSL atau B) Anda ingin meluncurkan program windows dari prompt bash shell.

Jika B) maka ya jika Anda menginstal cygwin / bash. Sebagai contoh, instal git untuk windows dan Anda memiliki sistem yang berjalan di bawah windows dengan bash. Kemudian Anda bisa menjalankan start, sebenarnya itu dimasukkan sebagai skrip:

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

Jika A) maka akan jauh lebih sulit terutama jika Anda ingin meluncurkan program linux untuk menampilkan .pdf di jendela GUI. Perhatikan bahwa Windows tahu untuk mengaitkan aplikasi default untuk membuka file pdf tetapi WSL tidak memiliki informasi. Jadi, bahkan jika Anda mendapatkan Desktop yang berjalan di bawah WSL Anda harus mengaitkan aplikasi GUI linux untuk membuka pdf.

Catatan untuk memperjelas, dalam WSL Anda mengeksekusi executable linux bukan executables 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

Seperti yang dicatat Martijn, ini adalah cara yang benar untuk menjalankan / membuka aplikasi / file Windows.

cmd.exe /C start <file>

Saya merasa sangat berguna untuk mengerjakan ini menjadi skrip bash yang saya simpan di folder yang ada di jalur sistem saya. Saya beri nama startdan lakukan chmod 0744ke file untuk membuatnya dapat dieksekusi. The $*berarti itu akan berlalu semua argumen baris perintah yang Anda berikan untuk script untuk cmd.exe.

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

Dengan perintah ini di jalur sistem saya, saya dapat perintah seperti ini di Linux yang terbuka di Windows:

  1. start FileXYZ.pdf // Buka PDF di penampil PDF yang ditetapkan secara default di Windows
  2. start explorer . // Buka folder WSL saat ini di Windows Explorer
  3. start MyApp.exe // Luncurkan aplikasi Windows

1
Satu-satunya masalah adalah bahwa solusi ini tidak berfungsi dengan file yang memiliki spasi putih dalam namanya.
0x7d7b

@ h3nrik Poin bagus. Saya kira saya tidak membuka banyak file dengan spasi di Linux. Saya memperbarui skrip untuk mengatasinya.
pseudosavant

Di Linux nama file dengan spasi putih biasanya ditangani dengan garis miring terbalik seperti a\ whitespace.pdf. Memulai skrip Anda seperti start.sh a\ a.pdf b\ b.pdftidak akan berfungsi.
0x7d7b

explorer.exe .membuka jalur saat ini di Windows Explorer
johnny

1

eopen dapat membuka berbagai file (, direktori dan URI) dalam WSL.

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

Contohnya

# 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

Ini bekerja lebih baik untuk saya:

explorer.exe `wslpath -aw <path>`

1

Anda dapat memanggil Start-Processperintah powershell dari dalam WSL:

powershell.exe -Command Start-Process file

Untuk membuat ini juga berfungsi dengan path absolut, Anda dapat menggunakan wslpath -waperintah untuk menerjemahkan path ke path windows.

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

Ini memiliki keunggulan dibandingkan cmd.exesolusi: untuk berbagi jaringan yang dipasang, wslpathmenghasilkan jalur UNC seperti \\server\share\. Jalur UNC ini tidak dapat ditangani oleh cmd.exe.


1

Saya telah menemukan bahwa explorer.exe bekerja cukup baik dalam menemukan jalur yang diselesaikan dengan benar (bahkan dari direktori jaringan yang dipasang) dan meluncurkan alat default. Satu-satunya masalah adalah Anda tidak dapat memiliki path dalam nama file, jadi Anda perlu membuat fungsi / skrip pembantu kecil untuk meluncurkan explorer dengan benar, misalnya:

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

Pembaruan: Ngo menunjukkan skrip lain wslpath,, yang melakukan konversi jalur, sehingga Anda dapat memanggil explorer.exe langsung di jalur (setelah mengonversi). Maka fungsi di atas menjadi sepele dan dapat dengan mudah dibuat alias.


Solusi yang sangat baik!
Stabledog

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.