如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称

Posted

技术标签:

【中文标题】如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称【英文标题】:How to list the names of all the files and directories in a folder using for loop in a batch file 【发布时间】:2022-01-17 13:40:51 【问题描述】:

我想在批处理脚本中使用 for 循环列出目录中的所有文件和目录。我该怎么做?

我在下面用过,但没用:

for /r %%I in (".") do ( ls -ltr '%%I') ## Listing only filenames and not directories name

任何帮助都是可观的。

谢谢!

【问题讨论】:

它只列出目录而不是文件名,恕我直言 ls 不是 Windows 命令 是的,但我已经安装并使用了 Cygwin。但是如果您有更好的选择,请提出建议 我已经更改了答案,并包含了一个有望在 Cygwin 中工作的解决方案 【参考方案1】:

创建两个循环,一个用于文件

for /r %%i in (*.*) do <something>

一个用于目录

for /r %%i in (.) do <something>

do之后使用相同的命令

但是,既然您已经安装了 Cygwin,为什么不使用该功能并这样做

find . | xargs -L1 ls -ltr

find . 查找所有文件和目录,| xargs 将输出传递给 xargs-L1 在每一行之后拆分输出并将每一行传递给 ls -ltr

【讨论】:

谢谢@Thomas。但是我们可以通过单个 for 循环来做到这一点吗?我们可以使用 find 你提到的命令(你提到的这个 find 命令仍然没有列出 dir 和 files 的名称,它只是列出了实际上不需要的内容),但只是想知道它是否可以通过 single批量for循环 标准的for /r 循环不会“列出所有目录中的文件和目录”。它不包括隐藏文件,虽然这可能是一般用途所需要的,但不能满足问题正文中的要求。 @Compo:我将“全部”解释为文件+目录,而不是仅文件或仅目录,因为 OP 写的是“而不是目录名称” @AskQuestionsP:为什么单个命令优于 2 个命令?我不明白find 的问题你所说的“里面的内容”是什么意思?里面是什么?它不读取文件内容,它只是查找文件和目录【参考方案2】:

如果你只想要一个目录和文件的列表,递归,怎么办:

dir /b/s "."

如果您想对每个流项目做一些特别的事情,使用for 循环,您可以执行以下操作:

for /f "tokens=* delims=" %%i in ('dir /b/s "."') do ( echo "%%i" )

这里我使用echo 来回显,但你可以放任何你需要的东西。

【讨论】:

A dir . 不会“列出所有目录中的文件和目录”。例如,它不包括隐藏文件和系统文件,虽然这可能是一般用途所需要的,但不满足问题正文中的要求。【参考方案3】:

“在批处理脚本中使用 for 循环列出目录中的所有文件和目录。”你应该使用DIR 命令。

如果您打开命令提示符窗口,请输入 dir /? 并按 ENTER 键,您应该会看到其使用信息。

需要注意的重要一点是/A 选项。没有具体提到的是单独使用它,(不带附加参数DRHASILO,启用所有属性。

因此,以您将使用的裸格式递归地列出当前目录中的所有项目:

DIR /A /B /S

DIR . /A /B /S

如果您想在相对于当前目录的特定位置列出它们,您可以使用:

DIR "Location" /A /B /S

或:

DIR ".\Location" /A /B /S

对于特定的绝对路径:

DIR "L:\ocation" /A /B /S

如果您希望它与批处理文件本身位于同一位置,您可以使用当前脚本的特殊变量%0

DIR "%~dp0." /A /B /S

要在For 循环中执行该命令,您应首先打开命令提示符窗口,键入for /? 并按ENTER 键,以读取其使用信息。

您应该注意您正在运行一个命令,因此应该使用FOR /F 循环,即

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

但也要注意:

To use the FOR command in a batch program, specify %%variable instead of %variable.

所以:

FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]

由于您已经掌握了命令,因此选项现在变得很重要。您需要了解的第一个是eol,虽然它似乎意味着行尾,但只针对一个结束,即开始!如果它以单个特定字符开头,它不会将'command' 的任何结果传递给DOeol 的默认值是分号 ;(可能是因为在历史上它是许多文件中常用的行注释标记)。通常,文件或目录名称可以包含并以分号开头,因此为了包含所有文件,您需要指定一个不能包含在文件名中的字符,对我来说最简单的是?,虽然我已经看到很多使用| 的例子。但是,当您执行递归DIR 命令时,每个返回的行都是一个完全限定的路径,其中任何一条都不能以分号开头,因此您可以为此任务忽略eol。您显然希望返回所有内容,因此不需要 skip 返回任何行。 tokensdelimiters,根据您想要对结果执行的操作进行调整,在这种情况下,您希望“命令”返回的每一行的全部内容不分割特定字符。您应该注意tokens 默认为1delims 默认为空格和水平制表符。因此,您应该规定您不需要任何分隔符,以便第一个标记是“命令”的每一行返回的所有内容。您很少需要 usebackq 选项,因此出于此答案和您的任务的目的,请忽略它。

现在把它们放在一起:

FOR /F "delims=" %%G IN ('DIR "Location" /A /B /S') DO command

最后,您可以将您想要的 DO 命令与括号中的 DIR 命令的每个结果一起使用。该结果将保存在您的变量 %%G 中。

为了查看每个结果,我们将使用ECHO 命令,(您只需将其替换为您选择的命令)。请注意,由于DIR 命令的每个结果都是文件或目录名称字符串,因此您通常应该将其双引号。

allObjects.cmd

FOR /F "delims=" %%G IN ('DIR "Location" /A /B /S') DO ECHO "%%G"

请记住在运行 Windows 命令脚本之前根据需要替换 "Location"

【讨论】:

以上是关于如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称的主要内容,如果未能解决你的问题,请参考以下文章

如何逐步在批处理文件中运行for循环

如何使用 for 循环在 Matlab 中读取许多声音文件?

通过在 Spark 中列出该位置下的文件来避免“for 循环”

FOR 循环空间和处理

我将如何隔离或仅将第二个元素存储在批处理文件内的 for 循环中?

如何在批处理文件中的for循环中使用可变长度的子字符串?