如何使用默认应用程序从WSL“打开”文件?


12

大多数系统提供了一个open命令(也就是通常所说startcygstartxdg-open这将打开在桌面环境中的“默认”的应用程序,不管它是什么文件等)。

例如,从Powershell输入以下内容时:

PS> start form.pdf

该文档在Edge中弹出。

Windows上的Ubuntu上的Bash可以做到吗?

Answers:


29

自Windows Linux互操作程序开始工作以来,您现在可以致电:

cmd.exe /C start <file>

对我有用,对于相对路径,对于绝对路径,我写了一个脚本,用c代替/ mnt / c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
迈克尔

1
不错的解决方案。我们还可以使用superuser.com/q/1110974/66714中的信息来访问Linux文件系统上的文件。就像cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"现在我们正在用火做饭!
Cheezmeister

2

这取决于您是否要A)在WSL中启动linux程序,还是B)您要从bash shell提示符启动Windows程序。

如果是B),则如果您安装cygwin / bash,则为是。例如,为Windows安装git,您有一个使用bash在Windows下运行的系统。然后,您可以运行start,实际上它作为脚本包含在其中:

$ 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程序以在GUI窗口中显示.pdf时。请注意,Windows知道可以关联默认应用程序以打开pdf文件,但WSL没有该信息。因此,即使您确实在WSL下运行Desktop,也需要关联linux GUI应用程序以打开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

2

正如Martijn所指出的,这是执行/打开Windows应用程序/文件的正确方法。

cmd.exe /C start <file>

我发现将其处理为bash脚本非常有用,该脚本保存在系统路径中的文件夹中。我将其命名startchmod 0744对该文件执行以使其可执行。这$*意味着它将把您提供给脚本的所有命令行参数传递给cmd.exe

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

在系统路径中使用此命令,我可以在Windows中打开如下命令:

  1. start FileXYZ.pdf //在Windows中默认分配的PDF查看器中打开PDF
  2. start explorer . //在Windows资源管理器中打开当前的WSL文件夹
  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资源管理器中打开当前路径
约翰尼

1

eopen 可以在WSL中打开各种文件(目录和URI)。

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从WSL中调用powershell的命令:

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

更新: Ngo指出了另一个脚本,wslpath它可以进行路径转换,因此您可以直接在路径上(转换后)调用explorer.exe。这样,上面的函数就变得微不足道了,可以轻松地用作别名。


优秀的解决方案!
稳定狗

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.