快速修复
# WSL 内:打开两个开关(没有该段就整段追加)
echo -e "[interop]\nenabled=true\nappendWindowsPath=true" >> /etc/wsl.conf
# Windows 侧:重启发行版生效
wsl --terminate <发行版名>
wsl -d <发行版名>
你会遇到什么
在 WSL 里 notepad.exe / cmd.exe / explorer.exe 全部报 command not found,which cmd.exe 也找不到;Windows 侧的程序一个都调不动。
WSL 的 interop(Windows/Linux 互操作)被关掉了——多半是 /etc/wsl.conf 里写了 [interop] enabled=false 或 appendWindowsPath=false(照着某些「纯净化/安全加固」教程抄的)。
本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。
为什么会这样
interop 是 WSL 的互操作机制(默认开启):把 Windows 可执行文件通过 binfmt 注册进 Linux,让你在 WSL 里直接运行 .exe,并把 Windows PATH 追加进 Linux PATH。
/etc/wsl.conf 的 [interop] 段两个开关:enabled=false 直接关掉运行 Windows 进程的能力(binfmt 注册被移除);appendWindowsPath=false 不再把 Windows PATH 追加进来(which cmd.exe 找不到)。
enabled 管的是「能不能执行」:WSL 启动时根据该开关注册/不注册 binfmt 处理器,关掉后任何 .exe 都是 command not found。
appendWindowsPath 管的是「找不找得到」:WSL 默认把 Windows 的 PATH 追加到 Linux PATH 末尾,关掉后 /mnt/c/Windows/system32/ 不在 PATH 里,就算 interop 开着也直接输路径才能运行。
两个开关独立,症状不同:enabled=false = 直接运行报 command not found;appendWindowsPath=false = which 找不到但 /mnt/c/.../cmd.exe 全路径能跑。确定性推论:先 cat /etc/wsl.conf 看 [interop] 段,再 which cmd.exe 分流——两个都查过再动手。
一步步来
1. 看 wsl.conf 有没有 [interop] 段 — 必做
cat /etc/wsl.conf
2. 按症状分流 — 按诊断结果
- 有
enabled=false→ 改成enabled=true; - 有
appendWindowsPath=false→ 改成appendWindowsPath=true; - 两行都有 → 全改回来。
3. 重启发行版 — 必做
# Windows 侧
wsl --terminate <发行版名>
wsl -d <发行版名>
4. 验证 — 必做
which cmd.exe # 能找到 = PATH 已追加
cmd.exe /c echo interop-ok # 能执行 = binfmt 注册恢复
怎么确认修好了
which cmd.exe 命中 /mnt/c/Windows/system32/cmd.exe;cmd.exe /c echo ok 正常执行(控制台中文乱码是 UTF-16 编码显示问题,不影响执行成功)。
其它环境的表现
| 开关 | 症状 |
|---|---|
enabled=false | 直接运行 .exe 报 command not found(binfmt 没注册) |
appendWindowsPath=false | which 找不到,但全路径 /mnt/c/Windows/system32/cmd.exe 能跑 |
| 两个都关 | 两种症状叠加 |
症状
$ notepad.exe
-bash: notepad.exe: command not found
$ which cmd.exe
(无输出)
特征:WSL 里 Windows 程序集体消失;/etc/wsl.conf 有 [interop] 段且值为 false;改完没重启发行版也会「看起来没生效」。
原因
interop 默认开启,靠启动时注册 binfmt(enabled)与追加 Windows PATH(appendWindowsPath)实现。wsl.conf 把两个开关设为 false 后,Windows 进程不可执行且 PATH 里找不到。改 wsl.conf 必须重启发行版生效。
解法
cat /etc/wsl.conf找[interop]段;enabled=true+appendWindowsPath=true(没有该段就整段追加);- Windows 侧
wsl --terminate <发行版名>重启; which cmd.exe+ 运行验证。
验证证据
- 机制核对:微软官方文档(learn.microsoft.com/windows/wsl/wsl-config 的 [interop] 段);
- 本机对照(2026-08-31):定制预构建版未配置 [interop] 段(默认全开)——
which cmd.exe命中、cmd.exe /c echo可执行;未做故障复现(避免影响工作环境); - 实测复现日志(2026-08-31)
相关 canonical
按「前置 → 同根 / 同域 / 相关」读:
- 相关(报错相近,根因不同):
- WSL systemd 起不来(同为 wsl.conf 配置坑:改完必须重启发行版)
- PowerShell 调 wsl 输出乱码(WSL 互操作的编码面问题)
适用工具 (1)
本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。
wsl · 外部工具来源与证据
← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡