描述:
我无法bash
从桌面打开的命令行执行。我必须cd
运行system32
它。
错误信息:
‘bash’ 不被识别为内部或外部命令,也不是
可运行的程序或批处理文件。
预期成绩:
bash
输入后cmd
,Windows Subsystem for Linux 将在当前目录中打开。
额外的:
我已经启用了适用于 Linux 的 Windows 子系统,bash
Ubuntu 应用程序运行良好。我认为存在问题PATH
,但不确定如何解决。
Windows 开发人员模式已启用。旧版控制台未选中。
系统环境变量及其值:
ComSpec C:\Windows\system32\cmd.exe
DriverData C:\Windows\System32\Drivers\DriverData
NUMBER OF_PROCESSORS 8
OS Windows_NT
Path C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin;C:\Pr...
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE AMD64
PROCESSOR_IDENTIFIER Intel64 Family 6 Model 142 Stepping 12, GenuineIntel
PROCESSOR_LEVEL 6
PROCESSOR_REVISION 8e0c
PSModulePath %ProgramFiles%\WindowsPowerShell\Modules;C:\Windows\s...
TEMP C:\Windows\TEMP
TMP C:\Windows\TEMP
USERNAME SYSTEM
windir C:\Windows
System32 中的搜索结果
bash.exe.mui Date modified: 2020-07-03 7:33 PM
C:\Windows\System32\en-US Type: MUI File Size: 4.50 KB
bash.exe Date modified: 2020-01-01 10:10 PM
C:\Windows\System32 Type: Application Size: 118 KB
答案1
适用于 Linux 的 Windows 子系统
目前使用Windows 10 1903根据 Windows 更新历史记录。我的第一个建议是升级到目前最新的 Windows 10,Windows 10 2004使用 Microsoft 页面下载 Windows 10如果可能的话。适用于 Linux 的 Windows 子系统(WSL)就像介绍适用于 Linux 的 Windows 子系统2例如可以在维基百科页面上看到Windows 10 版本历史记录为了版本 2004(2020 年 5 月更新)。 这Windows 开发人员模式在开始 Windows 10 升级之前应将其禁用。
错误原因
错误是由于在 中启动了 32 位 Windows 命令处理器%SystemRoot%\SysWOW64\cmd.exe
而不是 中的 64 位版本而导致的%SystemRoot%\System\cmd.exe
。因此,Windows文件系统重定向器当 32 位 Windows 命令处理器C:\Windows\System32
从当地的环境变量来搜索具有以下文件扩展PATH
名的文件:bash
当地的环境变量PATEXT
导致在目录中搜索C:\Windows\SysWOW64
。bash
但是 Windows 系统目录中没有bash.exe
32 位应用程序。因此bash.exe
32 位 找不到cmd.exe
。
请阅读 Stack Overflow“X 不是内部或外部命令,也不是可运行程序或批处理文件”是什么原因?cmd.exe
有关如何使用PATH
以及PATHEXT
用户如何配置这两个非常重要的环境变量的更多详细信息。
解决方案 1:使用 64 位 Windows 命令处理器
第一个解决方案是打开 64 位命令提示符通过启动%SystemRoot%\System\cmd.exe
而不是%SystemRoot%\SysWOW64\cmd.exe
在 64 位 Windows 上启动。
这绝对是最好且最容易实现的解决方案。
解决方案 2:使用完整限定文件名运行 BASH
第二种解决方案是bash
从 32 位命令提示符窗口内运行,使用特殊别名使用完整限定文件名,Sysnative
这意味着键入C:\Windows\Sysnative\bash.exe
而不是仅仅输入bash
。
另请参阅 Microsoft 文档命名文件、路径和命名空间。
这绝对是使用 32 位 Windows 环境的最佳解决方案。
解决方案 3:硬链接到 bash.exe
注意力:不建议长期使用此解决方案!
第三种解决方案是以%SystemRoot%\SysWOW64\cmd.exe
管理员身份启动,在 Windows 文件资源管理器中使用鼠标辅助按钮(右键)单击此文件,然后单击上下文菜单项以管理员身份运行以本地管理员的提升权限明确启动 32 位 Windows 命令处理器。
接下来输入以下命令行:
mklink /H %SystemRoot%\SysWOW64\bash.exe %SystemRoot%\Sysnative\bash.exe
这将创建一个硬链接,其名称为 目录中bash.exe
的文件。然后 32 位应用程序可以找到 中的文件,从而导致64 位应用程序在 Windows 系统目录中执行。%SystemRoot%\SysWOW64
bash.exe
%SystemRoot%\Sysnative
cmd.exe
bash.exe
%SystemRoot%\SysWOW64
%SystemRoot%\System32\bash.exe
在命令提示符窗口中运行mklink /?
以获取有关此命令的帮助,或阅读更好的 SS64 文档明科互联。
笔记:建议删除del %SystemRoot%\SysWOW64\bash.exe
在命令提示符窗口中执行的硬链接以管理员身份运行在进行 Windows 更新或 Windows 升级之前,在通过 Windows 更新/升级安装%SystemRoot%\System32\bash.exe
新版本后更新并重新创建硬链接。bash.exe
我不建议使用这个解决方案,因为它很容易在将来引起麻烦。
解决方案 4:创建 bash.cmd
注意力:为了与包含的批处理文件兼容,不建议使用此解决方案bash
!
第四种解决方案是以%SystemRoot%\SysWOW64\cmd.exe
管理员身份启动,在 Windows 文件资源管理器中使用鼠标辅助按钮(右键)单击此文件,然后单击上下文菜单项以管理员身份运行以本地管理员的提升权限明确启动 32 位 Windows 命令处理器。
接下来输入以下命令行:
echo @%SystemRoot%\Sysnative\bash.exe %*>%SystemRoot%\SysWOW64\bash.cmd
该命令行使用单个命令行在C:\Windows
批处理文件中创建并安装 Windows :C:\Windows\SysWOW64\bash.cmd
@C:\Windows\Sysnative\bash.exe %*
因此,32 位cmd.exe
现在可以bash
在 32 位 Windows 命令提示符窗口中输入文件,bash.cmd
使用%SystemRoot%\SysWOW64
目录路径C:\Windows\System32
当地的环境变量PATH
由文件系统重定向器重定向到C:\Windows\SysWOW64
。批处理文件运行C:\Windows\System32\bash.exe
时将启动时指定的所有参数传递bash.cmd
给 bash.exe
。
笔记:包含刚刚bash
由 32 位 Windows 命令处理器执行的 Windows 批处理文件导致通过 启动bash.exe
,bash.cmd
但随后不再通过 执行批处理文件中的命令行,cmd.exe
因为 Windows 命令处理器在完成执行后结束批处理文件执行,bash.cmd
而无需使用命令执行称呼bash
来自最初执行的批处理文件。因此,对于仅包含32 位执行的文件名的批处理文件,此解决方案并不安全cmd.exe
。
我不建议使用此解决方案,因为它可能会导致批处理文件出现问题。
结论
肯定还有更多的解决方案,但最好的是在 64 位 Windows 上运行 64 位 Windows 命令处理器,以便不受限制地访问从 Linux 移植的所有可执行文件,并默认与 Windows 10 一起安装,bash.exe
或目录中的可执行文件%SystemRoot%\System32\OpenSSH
也仅作为 64 位可执行文件存在。
答案2
错误原因
存在一个错误,即 Windows 认为旧式控制台已被激活,但实际上它并未被选中。
解决方案
脚步:
- 打开命令提示符
- 右键单击顶部栏,然后按特性
- 转到选项选项卡,然后选中旧版控制台
- 重新启动命令提示符
- 返回选项选项卡,取消选中旧版控制台
- 重新启动
- Windows BUG:命令提示符很可能是一个没有文本的黑框
- 转到“属性”,然后转到“终端”选项卡
- 取消选中
Use separate foreground
并“使用单独背景” - 现在输入
bash
cmd 并且它应该可以正常工作。