Arrays 直接输出到BAT数组?

Arrays 直接输出到BAT数组?,arrays,batch-file,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 d

有没有办法将“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

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%!
在上面的代码中,“数组”元素被命名为folder1、folder2、folder3

有些人使用文件夹[1]、文件夹[2]、文件夹[3]。。。相反它看起来更像数组,但这正是我不这么做的原因。不太了解批处理的人会看到这样的变量,并假设批处理正确地支持数组


如果任何文件夹名称包含
,上述解决方案将无法正常工作字符-在扩展%%F变量期间,由于扩展延迟,文件夹名称将损坏。有一个解决办法涉及打开和关闭延迟的扩展,但除非需要,否则不值得使用。

这不是答案,而是对dbenham答案的一个大评论

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

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

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

在我看来,这件事的中心不是讨论批处理是否正式支持数组,而是讨论任何人都可以使用数组概念来操作批处理文件中的数据这一事实。我认为可能有些人认为批处理可以正确地支持数组,特别是初学者,这一点没有问题;数组管理在不同的编程语言中是不同的,因此有必要解释批处理的详细信息。然而,如果对这个问题进行更正式的讨论似乎很重要,我想举一个不同的例子

您知道C编程语言不“正式支持”任何输入输出操作吗?当Dennis Ritchie设计它时,他特别将这些操作放在语言设计之外,以保持编译器的小型和紧凑。这是否意味着您不能在C程序中读取/写入任何数据?当然不是!这仅仅意味着这些操作是通过函数库在编译器外部实现的,因此如果您需要开发C编译器,您不必担心如何编译PRINT、READ或任何其他I/O语句,因为它们在C语言中根本不存在

很有趣,不是吗

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

好吧,依我拙见,同样的方法也应该用于批量数组的情况

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

用户对这一点的看法:

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


(参见上面的完整评论)。

是的,这与我提出的解决方案差不多,谢谢。您为什么使用引号?@user1229895-不需要引号,但它们使集合赋值的结束位置非常明确。只要开始引号在变量名之前,则忽略最后引号之后的任何文本<代码>设置“var=value”垃圾
将var设置为value,垃圾被忽略。它在视觉上很明显,提示的末尾有一个空格,它可以防止无意中在b中增加空格