DIR输出到BAT阵列?

时间:2012-05-11 02:28:00

标签: arrays batch-file

有没有办法读取' 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 个答案:

答案 0 :(得分:8)

Batch不正式支持数组,但您可以使用环境变量模拟数组。

@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%!

在上面的代码中,“array”元素被命名为folder1,folder2,folder3 ......

有些人使用文件夹[1],文件夹[2],文件夹[3]等名称。它当然看起来更像阵列,但这正是我不这样做的原因。对批处理不太了解的人会看到这样的变量并假设批处理正确支持数组。

如果任何文件夹名称包含!字符,上述解决方案将无法正常工作 - 由于扩展延迟,文件夹名称在扩展%% F变量期间将被破坏。有一种解决方法涉及切换延迟扩展的开关,但除非需要,否则不值得进入。

答案 1 :(得分:6)

这不是答案,而是回复dbenham答案的大评论。

我对这件事的观点恰恰与dbenhams的观点相反。在我看来,在Batch主题的答案中,我们必须非常简洁明了,特别是初学者,并提供有助于解决问题的最小信息,但不要压倒并使答案混淆。批处理中有两种模拟数组的方法:通过广泛使用的方括号来包含下标,但在两种情况下,概念都是相同的:选择一个通过数字索引从具有相同名称的变量列表中的特定元素。

如果不使用方括号,初学者就不会理解核心概念;相反,他们可能认为批处理文件使用“奇怪的技巧”来解决问题。另一方面,一位经验丰富的程序员肯定会说:“嘿!这是一个数组,但是以不同的方式编写”。没有办法将此功能误认为是其他任何不同的东西,没有理由把它伪装成其他不同的东西。

如果使用方括号,初学者将在许多编程语言中找到关于“数组”概念的大量信息和关于该主题的大量示例,甚至独立于任何编程语言的描述,当然,这些编程语言是立即使用的在批处理文件中。在这种情况下使用方括号更加清楚,不这样做。但是,有些人认为这些好处不值得假设Batch“正式支持数组”的“混乱”。

在我看来,这个问题的核心问题不是讨论Batch是否正式支持数组,而是任何人可以使用数组概念来处理批处理文件中的数据。我认为没有任何问题,有些人可能会认为Batch正确支持数组,特别是初学者;数组管理在不同的编程语言中是不同的,因此只需要对批处理细节进行解释。但是,如果对这个问题进行更正式的讨论似乎很重要,我想说明一个不同的例子。

您是否知道C编程语言不“正式支持”任何输入输出操作?当丹尼斯·里奇(Dennis Ritchie)设计它时,他特意将这些操作留在语言设计之外,以保持编译器小巧紧凑。这是否意味着您无法读取/写入C程序中的任何数据?当然不是!这只是意味着这些操作是通过函数库在外部编译实现的,所以如果你需要开发一个C编译器,你不必担心如何编译PRINT,READ或任何其他I / O声明,因为它们只是不存在于C语言中!

有趣,不是吗?

因此,如果初学者会问:“如何使用C语言编写消息?”,您认为正确答案应该是:“您不能.C语言不正式支持任何I / O 语句,但你可以通过库函数模拟这样的操作“?当然不是!大多数人只会回答描述printf,但实际上没有人提到printf()不是C语言的一部分,我认为这是正确的。在最终分析中,如果有人认为C语言支持I / O操作,会出现什么问题?人们可以在C程序中使用 I / O操作,无论它们的实现方式如何,对吧?

嗯,在我的拙见中,对于Batch中的数组,应使用相同的方法。

也许这是一个更接近的例子:关于“批处理中的算术运算”有很多问题,答案通常是:“使用set /A命令”。我从来没有看到一个答案,表明“批处理文件不支持数字变量,只支持字符串,但可以通过多种方式模拟算术运算,如set /A命令”。为什么?当他们在批处理中讨论数组时,似乎纯粹主义者是“更纯粹主义者”,但他们并不关心其他主题,比如数字。我真的不明白经常澄清“批处理不支持数组”的目的!

用户rojo对此提出了建议:

  

这是一个迂腐的论点,无法解决问题者试图解决的问题

(见上文this answer的完整评论)。