Как пропустить через запятую строку в пакетном режиме?

Окна

Основываясь на сообщении (dos итерации через строку с разделителями), я написал script ниже, но не работал, как ожидалось.

Цель: заданная строка "Солнце, Гранит, Сумерки", я хочу получить каждое значение темы в цикле, чтобы я мог выполнить некоторую обработку со значением.

Токовый выход не соответствует:

list = "Sun,Granite,Twilight"
file name is "Sun Granite Twilight"

Для первой итерации это должно быть:

list = "Sun,Granite,Twilight"
file name is "Sun"

Затем вторая итерация должна быть "имя файла -" Гранит "и т.д. Что я делаю неправильно?

Код:

set themes=Sun,Granite,Twilight

call :parse "%themes%"
goto :end

:parse
setlocal
set list=%1
echo list = %list%
for /F "delims=," %%f in ("%list%") do (
    rem if the item exist
    if not "%%f" == "" call :getLineNumber %%f
    rem if next item exist
    if not "%%g" == "" call :parse "%%g"
)
endlocal

:getLineNumber
setlocal
echo file name is %1
set filename=%1
endlocal

:end

Ответ 1

Я сделал несколько изменений в вашем коде.

  • Need goto: eof в конце подпрограмм и в конце основной процедуры, чтобы вы не попадали в подпрограммы.
  • tokens = 1 * (%% f - первый токен, %% g - остальная часть строки)
  • ~ в списке set =% ~ 1, чтобы удалить кавычки, чтобы кавычки не накапливались

    @echo off
    set themes=Sun,Granite,Twilight
    
    call :parse "%themes%"
    pause
    goto :eof
    
    :parse
    setlocal
    set list=%~1
    echo list = %list%
    for /F "tokens=1* delims=," %%f in ("%list%") do (
        rem if the item exist
        if not "%%f" == "" call :getLineNumber %%f
        rem if next item exist
        if not "%%g" == "" call :parse "%%g"
    )
    endlocal
    goto :eof
    
    :getLineNumber
    setlocal
    echo file name is %1
    set filename=%1
    goto :eof
    

Ответ 2

Так я бы это сделал:

@echo off
set themes=Sun,Granite,Twilight
echo list = "%themes%"
for %%a in ("%themes:,=" "%") do (
   echo file name is %%a
)

То есть, измените Sun,Granite,Twilight на "Sun" "Granite" "Twilight", а затем обработайте каждую часть, заключенную в кавычки, в регулярную (NO/F option) команду for. Этот метод намного проще, чем итеративный цикл for /F на основе "delims=,".

Ответ 3

Я принял Aacini ответ и только слегка изменил его, чтобы удалить кавычки, чтобы кавычки могли быть добавлены или удалены так, как это было бы в желаемой команде.

@echo off
set themes=Hot Sun,Hard Granite,Shimmering Bright Twilight
for %%a in ("%themes:,=" "%") do (
    echo %%~a
)

Ответ 4

Похоже, ему нужно ключевое слово "tokens"...

@echo off
set themes=Sun,Granite,Twilight

call :parse "%themes%"
goto :end

:parse
setlocal
set list=%1

for /F "delims=, tokens=1*" %%f in (%list%) do (
    rem if the item exist
    if not "%%f" == "" call :getLineNumber %%f
    rem if next item exist
    if not "%%g" == "" call :parse "%%g"
)
endlocal
goto :end

:getLineNumber
setlocal
echo file name is %1
set filename=%1
endlocal 

:end