首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CMD在FreeCommander中双击启动批处理文件时找不到wsl命令?

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

Stack Overflow用户
提问于 2021-11-25 13:51:42
回答 1查看 2.6K关注 0票数 0

我想在登录时使用批处理脚本在Windows子系统中启动Linux中的Docker。当我作为管理员运行批处理文件时,它可以工作。所以我遵循了这个指南:在Windows 10中始终以管理员身份运行批处理文件

然后我将快捷方式放置到Startup文件夹中。脚本已经启动,但它总是在第一行退出。

然后,我尝试在FreeCommander中手动运行批处理文件。当我以管理员身份通过右键单击上下文菜单项运行脚本时,批处理脚本可以工作。但是当我双击运行批处理脚本时,会输出一条错误消息。输出错误消息是:

命令"wsl“不是拼写错误就是找不到。

这是批处理脚本:

代码语言:javascript
复制
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%"

我还彻底删除了Linux的Windows子系统,并重新安装了它,但问题依然存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-26 08:53:01

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

64位Windows上有两个系统目录,其处理器具有AMD64体系结构:

  1. 默认情况下,64位应用程序使用64位应用程序的%SystemRoot%\System32 .
  2. 默认情况下,32位应用程序使用32位应用程序的%SystemRoot%\SysWOW64 .

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

cmd.exe是通过使用本地环境变量PATHEXTPATH搜索批处理文件中指定的文件,文件名没有文件扩展名或文件扩展名,并且没有路径,如"X不被识别为内部或外部命令、可操作程序或批处理文件“的原因是什么?在详细说明中所解释的那样。

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

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

代码语言:javascript
复制
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if exist %SystemRoot%\System32\wsl.exe set "FileNameWSL=%SystemRoot%\System32\wsl.exe" & goto RunWSLCommands
if exist %SystemRoot%\Sysnative\wsl.exe set "FileNameWSL=%SystemRoot%\Sysnative\wsl.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%\System32\netsh.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 /?
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70112271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档