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
的令牌机制以行为基础。
每个输入行(行由换行符分隔)标记由选项 delims
和 tokens
构建。
delims=...
定义文本如何拆分为标记。
tokens=...
定义要创建多少个标记,第一个标记存储在 FOR 参数变量中,下一个标记按字母顺序存储在下一个参数字符中。
在此示例中,标记 %%A %%B %%C 用于存储 1
、2
、3
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 /p
:set /p "var=Prompt:"
我想读取一个包含多个(数字未终止)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
的令牌机制以行为基础。
每个输入行(行由换行符分隔)标记由选项 delims
和 tokens
构建。
delims=...
定义文本如何拆分为标记。
tokens=...
定义要创建多少个标记,第一个标记存储在 FOR 参数变量中,下一个标记按字母顺序存储在下一个参数字符中。
在此示例中,标记 %%A %%B %%C 用于存储 1
、2
、3
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 /p
:set /p "var=Prompt:"