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

ank*_*tis 28 linux windows bash ubuntu windows-subsystem-for-linux

随着2016年夏季的Windows 10周年更新,可以在新的Linux子系统Linux(WSL)中运行ubuntu二进制文件,这是一个"轻量级"虚拟化子系统.

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

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

[1]问题还在微软的"官方"GH支持回购中提出.

And*_*Mao 25

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

linux到windows

......反之亦然:

windows到linux

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

  • 他人注意:您必须在exe上包含扩展名和大小写正确的名称,才能正常工作。 (4认同)
  • 可能值得指出的是,他们将命令从`bash`更改为`wsl`,但看起来`bash`仍然有效,但可能会被弃用. (2认同)
  • @xotonic从WSL bash调用Windows exe-您需要包括扩展名“ nodepad.exe” (2认同)

ank*_*tis 24

原生解决方案

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

sudo echo ":WSLInterop:M::MZ::/init:" > /proc/sys/fs/binfmt_misc/register
Run Code Online (Sandbox Code Playgroud)

然后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
Run Code Online (Sandbox Code Playgroud)

并不是说任何win-executable必须驻留在windows(DrvFs)文件系统中 - 而不是在Linux的文件系统(VolFs)上 - 以便继承正确的Windows工作目录.

cbwin替代

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

  • wcmd:通过调用win-executable cmd.exe.
  • wrun:与...同步调用win-executable CreateProcess,然后等待死(不使用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.

提示:如果可执行文件与任何子项一起启动wcmdwrun生成,那么只有可执行文件保持活动状态才能生存.

换句话说,试图启动notepad.exewcmd将无法正常工作,因为记事本使用-将只是已经推出后杀死wrun(同步),或wstart在此情况下(异步).

  • 我必须使用 `echo ":WSLInterop:M::MZ::/init:" |sudo tee /proc/sys/fs/binfmt_misc/register`,否则它会显示“权限被拒绝”。 (4认同)
  • 使用 Creators Update (15063),运行命令行和 GUI exe 都可以正常工作。 (2认同)

efk*_*kah 5

为什么不直接使用

$ powershell.exe Start filename
Run Code Online (Sandbox Code Playgroud)

StartWindows 相当于xdg-open大多数 Linux 或openmacOS,这意味着“使用默认桌面应用程序打开”。我喜欢给它起别名来打开。