如何从WSL(Ubuntu)Bash运行Windows可执行文件

时间:2016-08-12 14:44:09

标签: linux windows bash ubuntu windows-subsystem-for-linux

与2016年夏天的 Windows 10周年更新一起,可以在新的Windows Subsystem for Linux (WSL)内运行 ubuntu 二进制文件,"轻量级&# 34;虚拟化子系统。

不幸的是,启动C:\Windows\System32\bash.exe,另一个bash ELF二进制文件在WSL中启动一个进程,从那里你无法逃脱!您可以只启动其他ELF二进制文件。

那么如何从Windows Bash执行*.exe文件?[1]

[1]问题也在Microsoft's "official" GH support repo中提出。

5 个答案:

答案 0 :(得分:22)

原生解决方案

Windows 10 Insider Preview Update (14951)提供的官方解决方案基于几乎被遗忘的用于启动二进制文件的binfmt_msc Linux工具。 binfmt_misc 的注册命令将是这样的(其中/init是临时 binfmt_misc "解释器"用于win-executables):

sudo echo ":WSLInterop:M::MZ::/init:" > /proc/sys/fs/binfmt_misc/register

然后win-executable将像常规程序一样启动:

$ export PATH=$PATH:/mnt/c/Windows/System32
$ notepad.exe
$ ipconfig.exe | grep IPv4 | cut -d: -f2
$ ls -la | findstr.exe foo.txt
$ cmd.exe /c dir
  

并非任何win-executable必须驻留在Windows( DrvFs )文件系统中 - 而不是Linux的文件系统( VolFs ) - 为了继承正确的 Windows 工作目录。

cbwin 替代

直到你得到最新版本,项目cbwin提供了一种解决方法,在WSL中安装了3个新的linux命令:

  • wcmd:通过cmd.exe调用win-executable。
  • wrun:与CreateProcess同步调用win-executable,等待死亡(不使用cmd.exe)。
  • wstart:启动分离(异步)命令(使用cmd.exe)。

要使用它们,您必须:

  1. 安装 cbwin
    • 新的outbash.exe将安装在您的常规Windows文件系统中(%PATH%中的某个位置),再加上
    • WSL文件系统中的3个linux命令。
  2. 使用此outbash.exe(无论您在何处安装)都可以启动WSL,而不是C:\Windows\System32\bash.exe
  3. 使用其中一个命令为任何win-executables添加前缀,例如: wrun notepad
  4. 提示:如果使用wcmdwrun启动的可执行文件会生成任何子项,那么只有在可执行文件保持活动状态的情况下才能生存。

    换句话说,尝试使用notepad.exe启动wcmd无法正常工作,因为 notepad 将在启动后被杀死 - 使用{{在这种情况下,1}}(同步)或wrun(异步)。

答案 1 :(得分:19)

Windows 10 Creators Update(版本1703,2017年4月)中,本机支持此功能。所以你现在可以从Linux运行Windows二进制文件......

linux to windows

......反之亦然:

windows to linux

有关详细信息,请参阅上面的链接文章。

答案 2 :(得分:2)

虽然从命令行运行.exe可以正常工作,但是当通过exec()从PHP运行时,我无法正常工作。但是,添加/init确实可以。这是我在Windows上安装的GraphicsMagick的/usr/local/bin/convert工作文件:

#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"

答案 3 :(得分:0)

我对此有些困惑。我添加了一个符号链接:

$ ls -l /c                                                                                               
lrwxrwxrwx 1 root root 5 Dec  3 10:24 /c -> mnt/c  

现在ls / c给出的结果与ls / mnt / c

相同

但是现在: / c /程序\文件/Java/jdk1.8.0_211/bin/java.exe -version ==>没事

但是:

/mnt/c/Program\ Files/Java/jdk1.8.0_211/bin/java.exe  -version 
java version "1.8.0_211"                                                                                                Java(TM) SE Runtime Environment (build 1.8.0_211-b12)                                                                   Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode) 

其他Windows可执行文件也发生同样的情况。 WSL是否有实现符号链接的错误?

答案 4 :(得分:0)

为什么不只是使用

$ powershell.exe Start filename

Start是Windows,相当于大多数Linux上的xdg-open或macOS上的open,表示“使用默认桌面应用程序打开”。我想为它打开别名。