You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:35:20