当前位置: 首页>>技术问答>>正文


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

问题描述

随着2016年夏季的Windows 10周年更新,可以在新的Windows Subsystem for Linux (WSL)(“lightweight”虚拟化子系统)中运行ubuntu二进制文件。

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

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

[1]问题也在Microsoft’s “official” GH support repo中提出。

最佳解决方法

原生解决方案

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

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

Not that any win-executable must reside in the windows (DrvFs) file-system – not on the Linux’s file-system (VolFs) – in order to inherit a proper Windows working-directory.

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-commands。

  2. 使用此outbash.exe(无论您在何处安装)都可以启动WSL,而不是C:\Windows\System32\bash.exe

  3. 使用其中一个命令为任何win-executables添加前缀,例如: wrun notepad

提示:如果使用wcmdwrun启动的可执行文件生成任何子项,则这些子项只能在可执行文件保持活动状态的时间内存活。

换句话说,尝试使用wcmd启动notepad.exe将无法工作,因为记事本将在启动后立即被杀死 – 在这种情况下使用wrun(同步)或wstart(异步)。

次佳解决方法

Windows 10 Creators Update(build 1703,2017年4月)中,这是本机支持的。所以你现在可以从Linux运行Windows二进制文件了…

linux,windows,bash,ubuntu,windows-subsystem-for-linux

……反之亦然:

linux,windows,bash,ubuntu,windows-subsystem-for-linux

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

第三种解决方法

从命令行运行.exe时,从PHP通过exec()运行时,我无法使用它。但是,添加/init确实有效。这是我在Windows上安装的GraphicsMagick的/usr/local/bin/convert文件:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6300.html,未经允许,请勿转载。