cmd batch - usebackq in for: string to split altered from comma separated to space separated

cmd batch - usebackq in for: string to split altered from comma separated to space separated

我想读取一个包含多个(数字未终止)Kafka 主机的字符串,并使用 cmd for 在单独的行中列出它们。

字符串如下:

host1:9092,host2:9092,host3:9092,...

而我拥有的是:

set /p BOOTSTRAPSERVERS="Bootstrap servers with port, separated by comma(by default localhost:9092): "
REM echo "%BOOTSTRAPSERVERS%"
if "%BOOTSTRAPSERVERS%"=="" set BOOTSTRAPSERVERS="localhost"

echo All the servers to connect: 
FOR /F "usebackq delims=," %%i in (`echo %BOOTSTRAPSERVERS%`) do (
    echo %%i
    echo.
)

但是,我只得到一行中的所有主机,space 分开:

All the servers to connect:
host1:9092 host2:9092 host3:9092

为什么?

如果我打开 @echo on,我会看到这个,这没有意义:

set /p BOOTSTRAPSERVERS="Bootstrap servers with port, separated by comma(by default localhost:9092): "
Bootstrap servers with port, separated by comma(by default localhost:9092): host1:9092,host2:9092,host3:9092

REM echo "host1:9092,host2:9092,host3:9092"

if "host1:9092,host2:9092,host3:9092" == "" set BOOTSTRAPSERVERS="localhost"

echo All the servers to connect:
All the servers to connect:

FOR /F "usebackq delims=," %i in (`echo host1:9092 host2:9092 host3:9092`) do (
echo %i
 echo.
)

(
echo host1:9092
 echo.
)
host1:9092

如果仔细观察,echo将字符串从逗号分隔变成了space分隔,而%BOOTSTRAPSERVERS%不是双引号。

如果是双引号,输出将是:

"host1:9092

为什么?

有没有更好的方法用定界符分割字符串?

FOR /F 的令牌机制以行为基础。
每个输入行(行由换行符分隔)标记由选项 delimstokens 构建。

delims=... 定义文本如何拆分为标记。
tokens=... 定义要创建多少个标记,第一个标记存储在 FOR 参数变量中,下一个标记按字母顺序存储在下一个参数字符中。

在此示例中,标记 %%A %%B %%C 用于存储 123

FOR /F "tokens=1,2,3" %%A ("1 2 3 4 5") DO ...

在您的情况下,您可能希望获得 host:value 的两个标记。
但是您目前只有一行,它不适用于 FOR /F

但是你可以用换行符LF替换每个,,替换是用!hosts:,=%%~L!
完成的 然后 FOR /F 得到多个 像:

host1:9092
host2:9092
host3:9092
host4:4711

这些行可以用 :

的分隔符分隔
@echo off
setlocal EnableDelayedExpansion

set "hosts=host1:9092,host2:9092,host3:9092,host4:4711"
(set LF=^
%=empty line=%
)

FOR %%L in ("!LF!") DO (
    FOR /F "tokens=1,2 delims=:" %%1 in ("!hosts:,=%%~L!") DO (
        echo Host: %%1 Value: %%2
    )
)

要按标准分隔符(SPACE、制表符、逗号)拆分字符串,您可以使用普通的 for 循环(无 /f):

set "bootstrapservers=host1:9092,host2:9092,host3:9092"
for %%a in (%bootstrapservers%) do echo %%a

输出:

host1:9092
host2:9092
host3:9092

注意 set 命令的语法(这样引号就不会成为值的一部分)。相同的语法适用于 set /pset /p "var=Prompt:"