DIR输出到BATarrays?

有一种方法可以读取BAT文件中“dir”命令的输出到数组中吗? 或者我需要输出到一个文件,然后读取文件,然后删除文件?

目的是获取目录中的文件夹列表,向每个文件夹添加一个数字,然后提示用户input数字以select一个文件夹。

更新:了解它!

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 /ac=c+1 ) REM test array ECHO !dir_4! ENDLOCAL 

批量并不正式支持数组,但可以使用环境variables来模拟数组。

 @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] …等名称。 它看起来更像数组,但这正是我不这样做的原因。 对批处理不太了解的人可以看到像这样的variables,并假设批处理正确地支持数组。

上面的解决scheme将无法正常工作,如果任何文件夹名称包含! 字符 – 在扩展%% Fvariables期间,文件夹名称将因为延迟扩展而损坏。 有一个解决延迟扩展开关的方法,但除非需要,否则不值得进入。

这不是一个答案,而是一个大的评论,作为答复dbenham的答案。

我对这个问题的看法恰恰与dbenhams相反。 在我看来,在对批处理主题的回答中,我们必须非常简明扼要,特别是对于初学者,并提供帮助解决问题的最低限度信息,而不是压倒一切,使答案混淆。 在Batch中有两种模拟数组的方法:通过广泛使用的方括号来包围下标,但在这两种情况下, 概念是相同的:通过数字索引从具有相同名称的variables列表中select特定元素。

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

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

在我看来,这个问题的中心点不是讨论批量是否正式支持数组,而是任何人都可以使用数组概念来操作batch file中的数据。 我觉得没有任何问题,有些人可能会认为批量支持数组​​,特别是初学者; 数组pipe理在不同的编程语言中是不同的,所以只需要对批处理细节进行解释。 但是,如果对这个问题进行更正式的讨论似乎很重要,我想说一个不同的例子。

你知道C编程语言不“正式支持”任何input输出操作吗? 当Dennis Ritchiedevise它时,他特别将这些操作留在了语言devise之外,以便使编译器小巧紧凑。 这是否意味着你不能在C程序中读/写任何数据? 当然不是! 这只是意味着这些操作是通过函数库在编译器之外实现的,所以如果您需要开发一个C编译器,您不必担心如何编译PRINT,READ或任何其他I / O语句,因为它们不存在在C语言中!

有趣的是不是?

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

那么,在我看来,在批量数组的情况下应该使用相同的方法。

也许更接近这个例子:关于“Batch中的算术运算”有很多问题,答案通常是:“use set /A command”。 我从来没有看到一个答案,表明“batch file不支持数字variables,只是string,但算术运算可以通过几种方式模拟,如set /A命令”。 为什么? 看起来,纯粹主义者在批量处理数组的时候是“更纯粹主义者”,但他们并不关心其他话题,比如数字。 我真的不明白“批量不支持数组”的频繁澄清的目的! 所以用户罗霍认为这一点:“这是一个迂腐的论点,没有解决问题,试图解决问题”(见他的完整评论上面的这个答案 )。

安东尼奥