技术标签:
【中文标题】为啥在 FreeCommander 中双击启动批处理文件时 CMD 找不到 wsl 命令?【英文标题】:Why is the wsl command not found by CMD on starting a batch file with a double click in FreeCommander?为什么在 FreeCommander 中双击启动批处理文件时 CMD 找不到 wsl 命令? 【发布时间】:2022-01-03 19:09:50 【问题描述】:我想在登录时使用批处理脚本在适用于 Linux 的 Windows 子系统中启动 Docker。当我以管理员身份运行批处理文件时,它可以工作。所以我遵循了这个指南:Always Run Batch file as Administrator in Windows 10
然后我将快捷方式放入Startup
文件夹中。脚本已启动,但始终在第一行退出。
然后我尝试在 FreeCommander 中手动运行批处理文件。当我通过右键单击上下文菜单项以管理员身份运行脚本时,批处理脚本有效。但是当我双击运行批处理脚本时会输出一条错误消息。输出错误信息为:
命令“wsl”拼写错误或找不到。
这是批处理脚本:
FOR /F "tokens=* USEBACKQ" %%g IN (`wsl.exe sh -c "hostname -I"`) do (SET "ip=%%g")netsh interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=%ip%wsl sh -c "sudo dockerd -H tcp://%ip%"
我也完全删除了一次 Windows Subsystem for Linux 并重新安装它,但问题仍然存在。
【问题讨论】:
@Myrkjartan 那是因为您使用的是 32 位浏览器。扔掉它,改用 64 位的,或者由于某种原因你不能这样做,然后使用C:WindowsSysNative
重定向到真正的 system32 文件夹:Executable "C:WindowsSystem32Fodhelper.exe" not found,Jenkins: Run Windows batch commands in 32-bit mode 这能回答你的问题吗? Executable "C:WindowsSystem32Fodhelper.exe" not found 【参考方案1】: 应首先阅读以下 Microsoft 文档页面:
WOW64 Implementation DetailsFile System RedirectorRegistry Keys Affected by WOW64在采用 AMD64 架构处理器的 64 位 Windows 上有两个系统目录:
%SystemRoot%System32
与 64 位应用程序默认使用的 64 位应用程序。%SystemRoot%SysWOW64
与 32 位应用程序默认使用的 32 位应用程序。system 环境变量 PATH
包含 Windows 默认 %SystemRoot%System32
作为第一个文件夹路径。如果 32 位应用程序启动 cmd.exe
来处理批处理文件,则由于文件系统重定向器而启动了 32 位 %SystemRoot%SysWOW64cmd.exe
。
cmd.exe
正在使用 local 环境变量 PATHEXT
和 PATH
搜索批处理文件中指定的文件What is the reason for "X is not recognized as an internal or external command, operable program or batch file"?的全部详细信息
wsl.exe
属于在 AMD64 Windows 上仅作为 64 位版本存在于 %SystemRoot%System32
的可执行文件集。由于文件系统重定向器,在 local PATH
中使用扩展形式的 %SystemRoot%System32
时,%SystemRoot%SysWOW64
中没有 32 位版本被 32 位 cmd.exe
搜索。因此,问题中发布的批处理文件不适用于 Windows x64 上的 32 位 cmd.exe
处理。
解决方案是通过批处理文件中的附加代码考虑 WOW64:
@echo offsetlocal EnableExtensions DisableDelayedExpansionif exist %SystemRoot%System32wsl.exe set "FileNameWSL=%SystemRoot%System32wsl.exe" & goto RunWSLCommandsif exist %SystemRoot%Sysnativewsl.exe set "FileNameWSL=%SystemRoot%Sysnativewsl.exe" & goto RunWSLCommandsecho ERROR: Could not find wsl.exe. Script execution aborted.setlocal EnableDelayedExpansion & for /F "tokens=1,2" %%G in ("!CMDCMDLINE!") do endlocal & if /I "%%~nG" == "cmd" if /I "%%~H" == "/c" pauseexit /B:RunWSLCommandsfor /F "tokens=*" %%g in ("%FileNameWSL% sh -c "hostname -I"") do set "ip=%%g"%SystemRoot%System32
etsh.exe interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=%ip%%FileNameWSL% sh -c "sudo dockerd -H tcp://%ip%"endlocal
要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
exit /?
for /?
goto /?
if /?
netsh /?
netsh interface /?
netsh interface portproxy /?
netsh interface portproxy add /?
netsh interface portproxy add v4tov4 /?
pause /?
set /?
setlocal /?
【讨论】:
以上是关于为啥在 FreeCommander 中双击启动批处理文件时 CMD 找不到 wsl 命令?的主要内容,如果未能解决你的问题,请参考以下文章