我正在编写一个批处理脚本,将文件从 Windows 目录复制到 WSL 发行版。其中一部分是选择将文件复制到哪个发行版。如果我使用命令wsl --list -q
如果给我以下输出:
Ubuntu-22.04
Ubuntu-18.04
我正在尝试使用此处答案中描述的 FOR 循环过程来为发行版名称分配变量:如何将命令输出设置为批处理文件中的变量 https://stackoverflow.com/questions/6359820/how-to-set-commands-output-as-a-variable-in-a-batch-file
但是,第一个变量始终只是第一行的第一个字母 (U),第二个变量为空。
这就是我一直在尝试的:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`wsl --list -q`) DO (
SET "var!count!=%%F"
SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ENDLOCAL
Output:
U
ECHO is off.
我尝试删除 USEBACKQ,添加delims=
,并删除tokens=*
。我还尝试在发布的答案中使用单变量版本。我仍然只得到 U。如果我写wsl --list -q
到 .txt 文件,它可以正确写入。我试图避免将这些写入文件只是为了读取它们并删除文件。我想知道是否wsl --list
命令的输出与其他命令不同。如果我使用不同的命令,变量会正确填充,例如dir
.
这里有两个步骤:
- 转换
wsl --list
UTF-16-LE 的输出
- 从结果输出中获取发行版本
WSL 的 CLI 没有为第二步提供优雅的解决方案。但是,如果您的 PC 上只有 Ubuntu 映像,那么可以使用以下命令轻松标记这些映像delims=-
因为它们使用相同的格式命名。不过,处理结果字符编码是完全不同的故事,因为cmd.exe
没有提供将文本从一种编码转换为另一种编码的简单方法。也就是说,如果——再一次——wsl --list -q
输出任何内容,那么您确实安装了一些 WSL 发行版,并且您可以访问iconv
:
@echo off & setlocal EnableDelayedExpansion
set /a distros=0 >nul
for /f "tokens=1,2,* delims=- " %%i in (
'wsl --list --quiet ^| wsl --exec iconv -f UTF-16LE -t ASCII'
) do (
if /i "%%~i"=="Ubuntu" if not "%%~j"=="" (
set /a distros+=1 >nul 2>&1
if /i "%%~j"=="Ubuntu" (
set distros[!distros!]=%%~i
) else (
set distros[!distros!]=%%~i-%%~j
)
)
)
之后,可以像这样使用该数组:
for /l %%i in (1, 1, %distros%) do (
echo(!distros[%%~i]!
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)