Вопрос

Я пытаюсь выполнить следующую нелепую задачу:

У меня есть текстовый файл, содержащий набор полных имен файлов.Я хочу выполнить итерацию по файлу и добавить каждую строку к общей переменной, которая может быть передана инструменту командной строки.Например, файл может быть:

C:\dir est.txt

C:\WINDOWS est2.txt

C: ext3.txt

и я хотел бы присвоить им некоторую переменную 'a', такую, что:

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"

Вторичный вопрос заключается в том, что такое хорошая ссылка на пакетный файл?Я нахожу кое-что в материалах Windows и на множестве отечественных веб-сайтов, но ничего особенно полного.

Это было полезно?

Решение

Что касается ссылок, SS64.com это неплохо. Rob van der Woude тоже довольно часто получает ссылки.


Что касается вашей проблемы, это просто:

@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 одна строка - это либо строка , либо все , что считается в виде строки, которая имеет значение true для блоков, разделенных круглыми скобками, подобными той, которую мы использовали здесь.Так что для 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, которое является составным оператором.Итак, IF внутри составного оператора находится действительно сравнение "до" с "после" которое никогда не будет равным.Аналогично, следующий пример не будет работать так, как ожидалось:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

в том смысле, что он НЕ будет создавать список файлов в текущем каталоге, но вместо этого просто установит переменную LIST в значение последнего найденного файла.Опять же, это происходит потому, что %LIST% расширяется только один раз, когда читается инструкция FOR , и в это время переменная 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%

Другие советы

То, что вам нужно, может быть сделано с помощью ДЛЯ Команда /F.

Вот хороший ресурс, которым я пользовался много раз:

http://www.robvanderwoude.com/batchfiles.php

Хорошая книга:Сценарий оболочки Windows NT от Тима Хилла.Версия, которая у меня есть, была опубликована в 1998 году, но она все еще действительна для командных программ Windows в Windows 2008.

type *commonfilepart* >> concat_result_file

Операционная СИСТЕМА:WINDOWS SERVER 2003

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top