Вывод DIR в массив BAT?
Есть ли способ прочитать в выводе команды 'dir' в массив в файле BAT? Или мне нужно сначала вывести его в файл, затем прочитать файл и удалить файл после?
Цель состоит в том, чтобы получить список папок в каталоге, добавить номер к каждой из них, а затем предложить пользователю ввести числовой ввод для выбора папки.
ОБНОВЛЕНИЕ: получил это!
SETLOCAL EnableDelayedExpansion
SET /A c=1
FOR /F "tokens=*" %%F in ('dir /on /b /a:d /p %svnLOCAL%') DO (
ECHO !c!. %%F
SET dir_!c!=%%F
SET /a c=c+1
)
REM test array
ECHO !dir_4!
ENDLOCAL
2 ответа
Пакетная обработка формально не поддерживает массивы, но вы можете эмулировать массивы, используя переменные среды.
@echo off
setlocal enableDelayedExpansion
::build "array" of folders
set folderCnt=0
for /f "eol=: delims=" %%F in ('dir /b /ad *') do (
set /a folderCnt+=1
set "folder!folderCnt!=%%F"
)
::print menu
for /l %%N in (1 1 %folderCnt%) do echo %%N - !folder%%N!
echo(
:get selection
set selection=
set /p "selection=Enter a folder number: "
echo you picked %selection% - !folder%selection%!
В приведенном выше коде элементы "массива" называются folder1, folder2, folder3...
Некоторые люди вместо этого используют имена, такие как папка [1], папка [2], папка [3]... Это, конечно, выглядит как массив, но именно поэтому я этого не делаю. Люди, которые мало знают о пакетном режиме, видят такие переменные и считают, что пакетный режим правильно поддерживает массивы.
Решение выше не будет работать должным образом, если любое из имен папок содержит !
символ - имя папки будет повреждено при расширении переменной %%F из-за отложенного расширения. Существует обходной путь, включающий включение и выключение отложенного расширения, но в него не стоит входить, если в этом нет необходимости.
Это не ответ, а большой комментарий как ответ на ответ Дбенхема.
Моя точка зрения по этому вопросу совершенно противоположна точке зрения Дбенхамса. На мой взгляд, в ответах на темы Batch мы должны быть очень краткими и ясными, особенно с новичками, и предоставлять минимальную информацию, которая помогает решить проблему, но не перегружает и не запутывает ответы. Существует два способа имитации массивов в пакетном режиме: через широко используемые квадратные скобки, чтобы заключить нижний индекс, или нет, но в обоих случаях концепция одна и та же: выберите определенный элемент из списка переменных с тем же именем с помощью числового индекса.,
Если квадратные скобки не используются, начинающий не поймет основной концепции; вместо этого они могут подумать, что пакетный файл использовал "странный трюк" для решения проблемы. Опытный программист, с другой стороны, наверняка скажет: "Эй! Это массив, но написанный по-другому". Нет никакого способа принять эту особенность за любую другую вещь, и нет никакой причины замаскировать ее как другую вещь.
Если используются квадратные скобки, начинающий найдет массу информации о концепции "массива" и множество примеров по этой теме на многих языках программирования, и даже описания, независимые от любого языка программирования, которые, конечно же, незамедлительно используются в пакетных файлах., Использование квадратных скобок в этом случае гораздо понятнее, чем не делать этого. Тем не менее, некоторые люди думают, что эти преимущества не стоят "путаницы" с предположением, что Batch "формально поддерживает массивы".
По моему мнению, центральным вопросом в этом вопросе является не обсуждение вопроса о том, поддерживает ли пакет формально массивы или нет, а то, что любой человек может использовать концепцию массива для манипулирования данными в пакетных файлах. Я не вижу никаких проблем с возможностью того, что некоторые люди думают, что Batch правильно поддерживает массивы, особенно для начинающих; Управление массивами в разных языках программирования различно, поэтому просто необходимо объяснить детали пакета. Однако, если представляется более важным более формальное обсуждение этого вопроса, я хотел бы привести другой пример.
Знаете ли вы, что язык программирования C НЕ "формально поддерживает" какие-либо операции ввода-вывода? Когда Деннис Ритчи разработал его, он специально оставил эти операции вне языкового дизайна, чтобы компилятор был маленьким и компактным. Означает ли это, что вы не можете читать / записывать какие-либо данные в программах на C? Конечно, нет! Это просто означает, что эти операции реализуются вне компилятора через библиотеки функций, поэтому, если вам нужно разработать компилятор C, вам не нужно беспокоиться о том, как скомпилировать PRINT, READ или любой другой оператор ввода-вывода, потому что они просто не существуют на языке C!
Интересно, не правда ли?
Поэтому, если новичок спросит: "Как написать сообщение на языке C?", Как вы думаете, правильный ответ должен быть: "Вы не можете. Язык C формально не поддерживает какое-либо утверждение ввода-вывода, но вы можете эмулировать такие операции через библиотечные функции "? Конечно, нет! Большинство людей просто ответили бы, описывая printf, но практически никто не упомянул, что printf() НЕ является частью языка C, и я думаю, что это правильно. В конечном итоге, в чем проблема, если кто-то может подумать, что язык C поддерживает операции ввода-вывода? Люди могут использовать операции ввода / вывода в программах на C независимо от способа их реализации, верно?
Ну, по моему скромному мнению, такой же подход следует использовать в случае массивов в Batch.
Возможно, более близким примером является этот: есть много вопросов об "арифметических операциях в пакетном режиме", и ответ обычно таков: "использовать set /A
команда ". Я никогда не видел ответ, который указывает, что" Пакетные файлы не поддерживают числовые переменные, только строки, но арифметические операции можно эмулировать несколькими способами, например, set /A
команда ". Почему? Кажется, что пуристы" более пуристы ", когда они высказывают мнение о массивах в пакетном режиме, но им нет дела до других тем, таких как числа. Я действительно не понимаю цели частых разъяснений по поводу" Пакет не поддерживает массивы "! Так что пользователь rojo высказал мнение по этому поводу:" Это педантичный аргумент, который не предлагает решения проблем, которые пытаются решить спрашивающие " (см. его полный комментарий выше этого ответа).
Антонио