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

随着2016年夏季的Windows 10周年更新 ,有可能在新的Linux子系统(WSL) – 一个“轻量级”虚拟化子系统中运行Ubuntu二进制文件。

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

那么我怎样才能从Windows Bash执行*.exe文件?[1]

[1]在微软的“官方”GH支持回购中也问到了问题。

原生解决方案

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

 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可执行文件都必须驻留在Windows( DrvFs )文件系统中,而不是在Linux的文件系统( VolFs )上,以便继承正确的Windows工作目录。

cbwin的替代品

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

  • wcmd :通过cmd.exe调用win可执行文件。
  • wrun :与CreateProcess同步调用一个win可执行文件,并等待死(不使用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可执行文件,例如wrun notepad

提示:如果使用wcmdwrun启动的可执行文件产生任何子项,则只有在可执行文件保持活动状态的情况下才能存活。

换句话说,试图用wcmd启动notepad.exe将不起作用,因为记事本刚刚启动后将被wrun – 在这种情况下使用wrun (同步)或wstart (异步)。