ฉันจะ“ เปิด” ไฟล์จาก 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 shell prompt

ถ้า 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 ในหน้าต่าง GUI โปรดทราบว่า Windows รู้ถึงการเชื่อมโยงแอปพลิเคชันเริ่มต้นเพื่อเปิดไฟล์ pdf แต่ WSL ไม่มีข้อมูล ดังนั้นแม้ว่าคุณจะได้รับเดสก์ท็อปที่ทำงานภายใต้ WSLคุณจะต้องเชื่อมโยงแอพ linux GUI เพื่อเปิดไฟล์ PDF

หมายเหตุเพื่อความกระจ่างภายใน WSL คุณเรียกใช้งานโปรแกรมปฏิบัติการ linux ไม่ใช่หน้าต่างโปรแกรมปฏิบัติการ:

(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

ดังที่ Martijn กล่าวว่านี่เป็นวิธีที่ถูกต้องในการเรียกใช้ / เปิดแอปพลิเคชัน / ไฟล์ Windows

cmd.exe /C start <file>

ฉันพบว่ามีประโยชน์มากในการทำงานเป็นสคริปต์ทุบตีที่ฉันเก็บไว้ในโฟลเดอร์ที่อยู่ในเส้นทางของระบบของฉัน ฉันตั้งชื่อ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 Explorer
  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
johnny

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

คุณสามารถเรียกStart-Processคำสั่งของ powershell ได้จากภายใน WSL:

powershell.exe -Command Start-Process file

ในการทำให้สิ่งนี้ทำงานกับพา ธ สัมบูรณ์คุณสามารถใช้wslpath -waคำสั่งเพื่อแปลพา ธ ไปยัง windows-path

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

นี้มีประโยชน์มากกว่าที่cmd.exeการแก้ปัญหา: สำหรับการติดตั้งเครือข่ายหุ้น, wslpathก่อให้เกิดเส้นทาง UNC \\server\share\เช่น เส้นทาง UNC เหล่านี้ไม่สามารถจัดการcmd.exeได้


1

ฉันพบว่า explorer.exe ทำงานได้ค่อนข้างดีในการค้นหาเส้นทางที่ถูกต้องที่ถูกต้อง (แม้แต่ของไดเรกทอรีเครือข่ายที่เชื่อมต่อ) และเปิดใช้เครื่องมือเริ่มต้น gotcha เดียวคือคุณไม่สามารถมีพา ธ ในชื่อไฟล์ได้ดังนั้นคุณต้องสร้างฟังก์ชัน / สคริปต์ตัวช่วยเล็กน้อยเพื่อเรียกใช้ explorer อย่างถูกต้องเช่น:

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

Update: Ngo ชี้ให้เห็นสคริปต์อื่นwslpathซึ่งจะทำการแปลงเส้นทางดังนั้นคุณสามารถโทร explorer.exe โดยตรงบนเส้นทาง (หลังจากการแปลง) จากนั้นฟังก์ชั่นด้านบนจะกลายเป็นเรื่องเล็กน้อยและสามารถสร้างชื่อแทนได้อย่างง่ายดาย


ทางออกที่ดีเยี่ยม!
Stabledog

0

ลองใช้wsl-openดู จะเปิดไฟล์ที่มีมาตรฐานที่หน้าต่างโปรแกรมของพวกเขาและสามารถดาวน์โหลดได้ที่นี่: https://github.com/4U6U57/wsl-open


0

เพื่อขยายคำตอบของ Martijn คุณสามารถใส่

alias start='cmd.exe /C start'

ใน. bashrc ของคุณเพื่อรับพฤติกรรมของหน้าต่างที่คาดไว้เช่นstart .เปิด explorer ใน dir ปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.