В конце вывода из SET /?
находится этот камень о задержанном извлечении переменных среды. В нем показано, как использовать относительно новую нотацию (начиная с NT 3.1 - она работает в XP и Win 7) для отложенного расширения переменной среды для создания списка имен файлов, соответствующих шаблону в одной переменной.
Задержка расширения переменной среды позволяет использовать другой
символ (восклицательный знак), чтобы раскрыть переменные среды в
время исполнения. Если включено замедленное расширение переменной, выше
примеры могут быть написаны следующим образом, чтобы работать как задумано:
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
Обратите внимание, что здесь есть проблема с цитированием имен, содержащих пробелы или другие "интересные" символы, которые я оставил в качестве упражнения для студента. Правильное цитирование в CMD.EXE еще сложнее, чем в любой оболочке Unix.
Естественно, замените команду echo
вашей командной строкой.
Редактировать: Было замечено, что в пакетном файле это работает не так хорошо, и это зависит от того, какая специфическая функция отложенного расширения включена.
Функция отложенного расширения активируется переключателем /V:ON
на CMD.EXE или глобально для всех вызовов CMD с помощью ключа реестра. Подробности задокументированы в выводе CMD /?
.
Переходя к пакетному файлу, у вас есть пара проблем и простое исправление для включения этой функции. Ключ в том, что команда SETLOCAL
имеет возможность включать и выключать функцию задержки по желанию. От CMD /?
:
В пакетном файле SETLOCAL ENABLEDELAYEDEXPANSION
или DISABLEDELAYEDEXPANSION
Аргументы имеют приоритет над ключом /V:ON
или /V:OFF
. Смотри SETLOCAL /?
для деталей.
Кроме того, существует загадочная необходимость удваивать знаки процента в некоторых контекстах, таких как FOR
команды. Все вместе, я бы переписал мой пример так:
SETLOCAL ENABLEDELAYEDEXPANSION
set LIST=
for %%f in (*.ts) do set LIST=!LIST! "%%f"
echo %LIST:~1%
Вышеприведенное также заключает в кавычки каждое имя файла, чтобы иметь дело с именами, в которых есть пробелы, и обрезает дополнительный пробел в начале строки, оставленной там первой итерацией цикла, с %LIST:~1%
.