Аасини побил меня своим первым решением. Его можно улучшить, добавив кавычки, чтобы строка могла содержать пробелы и специальные символы и при этом давать правильный результат.
set "str=foo bar:biz bang:this & that"
for %%S in ("%str::=" "%") do echo %%~S
Решение имеет ограничения:
- Нет * или? может появиться в строке
- Проблемы могут возникнуть, если строка уже содержит кавычки ("), особенно если есть специальные символы
Второе решение имеет причудливый синтаксис, но концепция довольно проста. FOR / F со строкой будет разбивать символы перевода строки - каждая строка будет обрабатываться как отдельная строка. Хитрость заключается в замене разделителя :
символом перевода строки. Обратите внимание, что пустая строка в приведенном ниже решении является важной частью сложной замены. Кроме того, следующая строка должна начинаться с !
, который завершает расширение отложенной переменной. Не должно быть пробелов.
Другая вещь, о которой стоит беспокоиться, это противная опция FOR / F "EOL". Мы не хотим пропускать значения, начинающиеся с символа EOL, который по умолчанию равен ;
. Поскольку мы исключили разделитель строк :
, мы можем смело использовать его в качестве EOL.
Наконец, нам нужно использовать отложенное расширение, но !
будет повреждено при расширении %% S, если мы сначала не отключим отложенное расширение в цикле.
set "str=foo bar:biz bang:this & that "^& the other thing!":;How does this work?"
setlocal enableDelayedExpansion
set ^"str=!str::=^
!"
for /f "eol=: delims=" %%S in ("!str!") do (
if "!!"=="" endlocal
echo %%S
)
Я полагаю, что эта техника может справиться практически со всем, что вы на нее бросаете.
Джеб первым показал мне, как работать с переводами строк внутри пакета, и особенно, как использовать эту технику. Это может быть даже опубликовано где-то еще на SO.