Làm thế nào tôi có thể mở ra một tập tin từ WSL với ứng dụng mặc định?


12

Hầu hết các hệ thống cung cấp một openlệnh (luân phiên gọi là start, cygstart, xdg-openvv) mà mở ra một tập tin trong "mặc định" ứng dụng môi trường máy tính để bàn của, bất kể đó là.

Ví dụ: từ Powershell khi tôi nhập:

PS> start form.pdf

Tài liệu bật mở trong Edge.

Bash-on-Ubuntu-on-Windows có thể làm điều này không?

Câu trả lời:


29

Kể từ khi Windows Linux interop bắt đầu hoạt động, bây giờ bạn có thể gọi:

cmd.exe /C start <file>

Làm việc cho tôi cho các đường dẫn tương đối, cho các đường dẫn tuyệt đối Tôi đã viết một tập lệnh để thay thế / mnt / c bởi c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael

1
Giải pháp tốt đẹp. Chúng tôi cũng có thể truy cập các tệp trên hệ thống tệp Linux bằng thông tin từ superuser.com/q/1110974/66714 . Một cái gì đó giống như cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Bây giờ chúng tôi đang nấu ăn với lửa!
Cheezmeister

2

Điều này phụ thuộc vào việc bạn muốn A) khởi chạy chương trình linux bên trong WSL hay B) mà bạn muốn khởi chạy chương trình windows từ dấu nhắc bash shell.

Nếu B) thì có nếu bạn cài đặt cygwin / bash. Ví dụ: cài đặt git cho windows và bạn có một hệ thống chạy dưới windows với bash. Sau đó, bạn chỉ có thể chạy bắt đầu, thực sự nó được bao gồm dưới dạng một tập lệnh:

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

Nếu A) thì sẽ khó khăn hơn nhiều, đặc biệt nếu bạn muốn khởi chạy chương trình linux để hiển thị .pdf trong cửa sổ GUI. Lưu ý rằng Windows biết liên kết một ứng dụng mặc định để mở tệp pdf nhưng WSL không có thông tin. Vì vậy, ngay cả khi bạn đã có một Máy tính để bàn chạy trong WSL, bạn sẽ cần liên kết một ứng dụng GUI linux để mở pdf.

Lưu ý để làm rõ, trong WSL, bạn thực thi các tệp thực thi linux chứ không phải các tệp thực thi của 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

Như Martijn lưu ý đây là cách chính xác để thực thi / mở ứng dụng / tệp Windows.

cmd.exe /C start <file>

Tôi thấy nó rất hữu ích để làm việc này thành một tập lệnh bash mà tôi giữ trong một thư mục nằm trong đường dẫn hệ thống của tôi. Tôi đặt tên cho nó startvà làm chmod 0744cho tập tin để làm cho nó thực thi. Có $*nghĩa là nó sẽ chuyển tất cả các đối số dòng lệnh bạn đã cung cấp cho tập lệnh tớicmd.exe .

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

Với lệnh này trong đường dẫn hệ thống của tôi, tôi có thể ra lệnh như thế này trong Linux mở trong Windows:

  1. start FileXYZ.pdf // Mở tệp PDF trong trình xem PDF được gán mặc định trong Windows
  2. start explorer . // Mở thư mục WSL hiện tại trong Windows Explorer
  3. start MyApp.exe // Khởi chạy ứng dụng Windows

1
Vấn đề duy nhất là giải pháp này không hoạt động với các tệp có khoảng trắng trong tên của chúng.
0x7d7b

@ h3nrik Điểm tuyệt vời. Tôi đoán tôi không mở nhiều tệp có khoảng trắng trong Linux. Tôi đã cập nhật kịch bản nó để xử lý đó.
pseudosavant

Trên tên tệp Linux có khoảng trắng thường được xử lý bằng dấu gạch chéo ngược như thế nào a\ whitespace.pdf. Bắt đầu kịch bản của bạn như thế start.sh a\ a.pdf b\ b.pdfsẽ không hoạt động.
0x7d7b

explorer.exe .mở đường dẫn hiện tại trong Windows Explorer
johnny

1

eopen có thể mở các tệp khác nhau (, thư mục và URI) trong WSL.

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

Ví dụ

# 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

Điều này làm việc tốt hơn nhiều đối với tôi:

explorer.exe `wslpath -aw <path>`

1

Bạn có thể gọi lệnh powershell Start-Processtừ bên trong WSL:

powershell.exe -Command Start-Process file

Để làm điều này cũng hoạt động với các đường dẫn tuyệt đối, bạn có thể sử dụng wslpath -walệnh để dịch đường dẫn sang đường dẫn windows.

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

Điều này có một lợi thế so với cmd.exegiải pháp: đối với các chia sẻ mạng được gắn kết, wslpathtạo ra một đường dẫn UNC như thế nào \\server\share\. Những đường dẫn UNC này không thể được xử lý bởi cmd.exe.


1

Tôi đã thấy rằng explorer.exe hoạt động khá tốt trong việc tìm đường dẫn được giải quyết chính xác (ngay cả các thư mục mạng được gắn kết) và khởi chạy công cụ mặc định. Một điều đáng chú ý là bạn không thể có các đường dẫn trong tên tệp, vì vậy bạn cần tạo một hàm / tập lệnh trợ giúp nhỏ để khởi chạy trình thám hiểm chính xác, ví dụ:

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

Cập nhật: Ngo chỉ ra một tập lệnh khác wslpath, đó là chuyển đổi đường dẫn, vì vậy bạn có thể gọi explorer.exe trực tiếp trên đường dẫn (sau khi chuyển đổi). Sau đó, chức năng trên trở nên tầm thường và có thể dễ dàng được tạo thành bí danh.


Giải pháp tuyệt vời!
Stablesog

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.