Вопрос по batch-file, arrays – Вывод DIR в массив BAT?

3

Есть ли способ прочитать на выходе «dir»? команда в массив в BAT-файл? Или мне нужно сначала вывести его в файл, затем прочитать файл и удалить файл после?

Цель состоит в том, чтобы получить список папок в каталоге, добавить номер к каждой, а затем предложить пользователю ввести числовой ввод для выбора папки.

ОБНОВЛЕНИЕ: получил это!

<code>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
</code>
Я предлагаю вам увидеть этот ответ:stackoverflow.com/questions/10166386/… Aacini

Ваш Ответ

2   ответа
6

Моя точка зрения по этому вопросу совершенно противоположна точке зрения Дбенхама. На мой взгляд, в ответах на темы Batch мы должны быть очень краткими и ясными, особенно с новичками, и предоставлять минимальную информацию, которая помогает решить проблему, но не перегружает и не запутывает ответы. Есть два способаsimulate массивы в пакетном режиме: через широко используемые квадратные скобки, чтобы заключить нижний индекс, или нет, но в обоих случаяхconcept то же самое: выберите определенный элемент из списка переменных с тем же именем через числовой индекс.

Если квадратные скобки не используются, начинающий не поймет основной концепции; вместо этого они могут подумать, что в пакетном файле использовался «странный трюк» решить проблему. Опытный программист, с другой стороны, наверняка скажет: «Эй! Это массив, но написанный по-другому & quot ;. Нет никакого способа принять эту особенность за любую другую вещь, и нет никакой причины замаскировать ее как другую вещь.

Если используются квадратные скобки, начинающий найдет массу информации о «массиве» Концепция и множество примеров на эту тему на многих языках программирования, и даже описания, независимые от любого языка программирования, которые, конечно же, незамедлительно используются в пакетных файлах. Использование квадратных скобок в этом случае гораздо понятнее, чем не делать этого. Однако некоторые люди считают, что эти преимущества не стоят «замешательства». предположить, что пакет "формально поддерживает массивы".

На мой взгляд, центральным вопросом в этом вопросе является не обсуждение вопроса о том, поддерживает ли пакет формально поддержку массивов или нет, а тот факт, что какие-либо людиcan use концепция массива для манипулирования данными в пакетных файлах. Я не вижу никаких проблем с возможностью того, что некоторые люди думают, что Batch правильно поддерживает массивы, особенно для начинающих; Управление массивами различно в разных языках программирования, поэтому просто необходимо объяснить детали пакета. Однако, если представляется более важным более формальное обсуждение этой темы, я хотел бы привести другой пример.

Знаете ли вы, что язык программирования C НЕ «формально поддерживает»? любая операция ввода-вывода? Когда Деннис Ритчи разработал его, он специально оставил эти операции вне языкового дизайна, чтобы компилятор был маленьким и компактным. Означает ли это, что вы не можете читать / записывать какие-либо данные в программах на C? Конечно, нет! Это просто означает, что эти операции реализованыoutside компилятор через библиотеки функций, поэтому, если вам нужно разработать компилятор C, вам не нужно беспокоиться о том, как скомпилировать PRINT, READ или любой другой оператор ввода / вывода, потому что их просто нет в языке C!

Интересно, не правда ли?

Поэтому, если новичок спросит: «Как написать сообщение на языке Си?», Как вы думаете, правильный ответ должен быть: «Вы можете». Язык C формально не поддерживает ввод-выводstatement, но вы можете эмулировать такие операции с помощью библиотечных функций & quot ;? Конечно, нет! Большинство людей просто ответили бы с описанием printf, но практически никто не упомянул, что printf ()is NOT part of the C language и я думаю, что это правильно. В конечном счете, в чем проблема, если кто-то может подумать, что язык C поддерживает операции ввода-вывода? людиcan use Операции ввода-вывода в программах на C независимо от того, как они были реализованы, верно?

Ну, по моему скромному мнению, такой же подход следует использовать в случае массивов в Batch.

Возможно, более близким примером является следующий: есть много вопросов об «арифметических операциях в пакетном режиме». и ответ обычно таков:set /A Команда & Quot ;. Я никогда не видел ответа, который бы указывал на то, что «Пакетные файлы не поддерживают числовые переменные, только строки, но арифметические операции можно эмулировать несколькими способами, напримерset /A Команда & Quot ;. Зачем? Кажется, что пуристы являются «более пуристами» когда они высказывают мнение о массивах в пакетном режиме, но их не волнуют другие темы, например числа. Я действительно не понимаю цели частого разъяснения о том, что "пакет не поддерживает массивы"! ТАК. Пользователь rojo высказал мнение по этому поводу: «Это педантичный аргумент, который не предлагает решения проблем, которые задают спрашивающие». (см. его полный комментарий вышеэтот ответ).

Антонио

Мое удовольствие - хотя обычно мы говорим на родном или родном языке.
@RichardHarrison, user66001: спасибо вам обоим за ваши любезные исправления. Английский не мой молочный язык! Антонио
Меня цитировали и цитировали в опубликованной академической работе. Я чувствую такую честь! Это мое коронное достижение, вершина моего существования.
8

но вы можете эмулировать массивы, используя переменные окружения.

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

@ user1229895 - Кавычки не нужны, но они очень четко указывают, где заканчивается назначение SET. Пока начальная кавычка находится перед именем переменной, любой текст после последней кавычки игнорируется.SET "var=value" junk устанавливает переменную в значение, а мусор игнорируется. Это делает визуально очевидным наличие пробела в конце приглашения и защищает от непреднамеренных дополнительных пробелов в обоих операторах SET.
да, это примерно то же решение, которое я придумал, спасибо. Любая причина, почему вы использовали кавычки? user1229895

Похожие вопросы