如何在批处理文件中使用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
来回显,但你可以放任何你需要的东西。
【讨论】:
Adir .
不会“列出所有目录中的文件和目录”。例如,它不包括隐藏文件和系统文件,虽然这可能是一般用途所需要的,但不满足问题正文中的要求。【参考方案3】:
“在批处理脚本中使用 for 循环列出目录中的所有文件和目录。”你应该使用DIR
命令。
如果您打开命令提示符窗口,请输入 dir /?
并按 ENTER 键,您应该会看到其使用信息。
需要注意的重要一点是/A
选项。没有具体提到的是单独使用它,(不带附加参数D
、R
、H
、A
、S
、I
、L
或O
) ,启用所有属性。
因此,以您将使用的裸格式递归地列出当前目录中的所有项目:
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'
的任何结果传递给DO
。 eol
的默认值是分号 ;
,(可能是因为在历史上它是许多文件中常用的行注释标记)。通常,文件或目录名称可以包含并以分号开头,因此为了包含所有文件,您需要指定一个不能包含在文件名中的字符,对我来说最简单的是?
,虽然我已经看到很多使用|
的例子。但是,当您执行递归DIR
命令时,每个返回的行都是一个完全限定的路径,其中任何一条都不能以分号开头,因此您可以为此任务忽略eol
。您显然希望返回所有内容,因此不需要 skip
返回任何行。 tokens
和 delimiters
,根据您想要对结果执行的操作进行调整,在这种情况下,您希望“命令”返回的每一行的全部内容不分割特定字符。您应该注意tokens
默认为1
,delims
默认为空格和水平制表符。因此,您应该规定您不需要任何分隔符,以便第一个标记是“命令”的每一行返回的所有内容。您很少需要 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 循环在 Matlab 中读取许多声音文件?
通过在 Spark 中列出该位置下的文件来避免“for 循环”