批处理FOR循环处理wsl --list -q输出异常,仅获首字符如何解决?
批处理脚本读取WSL发行列表异常问题解决
问题场景
编写批处理脚本实现Windows文件复制到WSL发行版,需要先获取可用的WSL发行版列表。执行wsl --list -q可正常输出:
Ubuntu-22.04 Ubuntu-18.04
但使用FOR循环读取该命令输出并赋值给变量时,第一个变量仅得到首行首字母(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
输出结果
U ECHO is off.
问题原因
wsl --list -q的输出采用UTF-16 LE编码,而Windows批处理的FOR /F默认处理ANSI编码,编码不兼容导致解析异常:UTF-16中ASCII字符占两个字节,第二个字节为0,被批处理识别为行结束符,因此只能读取到每个行的第一个字符。
解决方案
通过findstr命令将WSL的UTF-16输出转换为ANSI编码,同时修正变量展开方式,修改后的代码如下:
@echo off SETLOCAL ENABLEDELAYEDEXPANSION SET count=1 FOR /F "tokens=* USEBACKQ" %%F IN (`wsl --list -q ^| findstr /r "^"`) DO ( SET "var!count!=%%F" SET /a count=!count!+1 ) ECHO !var1! ECHO !var2! ENDLOCAL
需要注意两个关键点:
- 管道符
|在FOR循环的反引号命令中需转义为^|,避免被批处理提前解析 - 输出变量时使用
!var1!而非%var1%,利用延迟变量展开特性读取执行阶段的最新变量值
内容的提问来源于stack exchange,提问作者PhantomLotus
相关产品推荐
相关产品推荐

