为什么CMD在FreeCommander中双击启动批处理文件时找不到wsl命令



我想在登录时使用批处理脚本在Windows Subsystem for Linux中启动Docker。当我以管理员身份运行批处理文件时,它就起作用了。所以我遵循了这个指南:总是在Windows10中以管理员身份运行批处理文件

然后我将快捷方式放入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并重新安装了它,但问题仍然存在。

应首先阅读以下Microsoft文档页面:

  • WOW64实施细节
  • 文件系统重定向器
  • 受WOW64影响的注册表项

使用AMD64体系结构的处理器的64位Windows上有两个系统目录:

  1. %SystemRoot%System32,默认情况下64位应用程序使用64位应用
  2. 默认情况下,具有32位应用程序的%SystemRoot%SysWOW64由32位应用软件使用

系统环境变量PATH在Windows默认情况下包含%SystemRoot%System32作为第一个文件夹路径。如果32位应用程序启动cmd.exe来处理批处理文件,则由于文件系统重定向程序的原因,会启动32位%SystemRoot%SysWOW64cmd.exe

CCD_ 8通过使用局部环境变量CCD_ 9和CCD_;X不被识别为内部或外部命令、可操作程序或批处理文件";?

wsl.exe属于一组可执行文件,在AMD64 Windows上,%SystemRoot%System32仅作为64位版本存在。由于文件系统重定向程序的原因,32位cmd.exe本地PATH中使用扩展形式的%SystemRoot%System32时,在%SystemRoot%SysWOW64中没有搜索到32位版本。因此,问题中发布的批处理文件无法在Windows x64上由32位cmd.exe处理。

解决方案是将WOW64与批处理文件中的附加代码一起考虑:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist %SystemRoot%System32wsl.exe set "FileNameWSL=%SystemRoot%System32wsl.exe" & goto RunWSLCommands
if exist %SystemRoot%Sysnativewsl.exe set "FileNameWSL=%SystemRoot%Sysnativewsl.exe" & goto RunWSLCommands
echo 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" pause
exit /B
:RunWSLCommands
for /F "tokens=*" %%g in ('%FileNameWSL% sh -c "hostname -I"') do set "ip=%%g"
%SystemRoot%System32netsh.exe interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=%ip%
%FileNameWSL% sh -c "sudo dockerd -H tcp://%ip%"
endlocal

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并完整仔细地阅读每个命令显示的帮助页。

  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • netsh /?
  • netsh interface /?
  • netsh interface portproxy /?
  • netsh interface portproxy add /?
  • netsh interface portproxy add v4tov4 /?
  • pause /?
  • set /?
  • setlocal /?

最新更新