cmd batch - usebackq in for: строка для разделения, измененная от запятой, разделенной пробелом - PullRequest
2 голосов
/ 16 января 2020

Я хочу прочитать строку, содержащую несколько (число не определено) хостов 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.
)

Но я получаю все хосты в одну строку, разделенные пробелом:

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 превращает строку из запятой в пробел, если %BOOTSTRAPSERVERS% не заключено в двойные кавычки.

Если в двойных кавычках выводится:

"host1:9092

Почему?

Есть ли лучший способ разбить строку с разделителями?

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Чтобы разделить строку по стандартным разделителям (SPACE, TAB, Comma), вы можете использовать простой for l oop (нет /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:"

2 голосов
/ 16 января 2020

Механизм токенов 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
    )
)
...