Что касается ссылок, SS64.com неплохо. Роб ван дер Вуде также довольно часто связывается.
Что касается вашей проблемы, это просто:
@echo off
setlocal enableextensions enabledelayedexpansion
set LIST=
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
echo %LIST%
endlocal
Более подробное объяснение:
setlocal enableextensions enabledelayedexpansion
Мы включаем отложенное расширение здесь. Это очень важно, так как в противном случае мы не смогли бы манипулировать списком файлов в следующем цикле for
.
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
for /f
перебирает строки в файле, так что именно то, что нам нужно здесь. В каждой итерации цикла мы добавляем следующую строку в переменную LIST
. Обратите внимание на использование !LIST!
вместо обычного %LIST%
. Это сигнализирует о задержке расширения и гарантирует, что переменная переоценивается при каждом запуске этой команды.
Обычно cmd
расширяет переменные до их значений, как только строка читается и анализируется. Для cmd
одна строка - это либо строка, либо все, что считает строкой, что справедливо для блоков, разделенных круглыми скобками, таких как мы использовали здесь. Таким образом, для cmd
полный блок представляет собой один оператор, который читается и анализируется один раз, независимо от того, как часто выполняется внутренняя часть цикла.
Если бы мы использовали %LIST%
здесь вместо !LIST!
, тогда переменная была бы немедленно заменена на ее значение (пустое в этой точке), и цикл выглядел бы так:
for /f %%x in (yourfile.txt) do (
set LIST= "%%x"
)
Очевидно, что это не то, что мы хотели. Отсроченное расширение гарантирует, что переменная раскрывается только тогда, когда ее значение действительно необходимо. В этом случае, когда внутренняя часть цикла запускается и составляется список имен файлов.
После этого переменная %LIST%
или !LIST!
(теперь уже не имеет значения, какой использовать) содержит список строк из файла.
Как ни странно, справка для команды set
включает в себя именно этот пример для отложенного расширения:
Наконец, поддержка отложена
расширение переменной среды имеет
был добавлен Эта поддержка всегда
по умолчанию отключено, но может быть
включается / отключается с помощью команды / V
линия переключается на CMD.EXE. Смотри CMD /?
Задержка расширения переменной среды
полезно для обхода
ограничения текущего расширения
что происходит, когда строка текста
читать, а не когда это выполняется.
Следующий пример демонстрирует
проблема с непосредственной переменной
расширение:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
никогда не будет отображать сообщение, так как
% VAR% в обоих выражениях IF
заменяется, когда первый IF
утверждение читается, так как оно логично
включает в себя тело IF, которое является
сложное утверждение. Итак, ЕСЛИ
внутри составного оператора
действительно сравнивая «до» с «после»
который никогда не будет равным. Так же,
следующий пример не будет работать как
Ожидаемый результат:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
в том смысле, что он НЕ будет составлять список
файлы в текущем каталоге, но
вместо этого будет просто установить список
переменная до последнего найденного файла.
Опять же, это потому, что% LIST%
расширен только один раз, когда ЗА
заявление читается, и в то время
переменная LIST пуста. Итак
Фактический цикл FOR, который мы выполняем:
for %i in (*) do set LIST= %i
, который просто устанавливает LIST на
последний найденный файл.
Задержка расширения переменной среды
позволяет использовать другой
символ (восклицательный знак) до
расширить переменные среды в
время исполнения. Если задержанная переменная
расширение включено, выше
примеры могут быть написаны следующим образом
работать по назначению:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%