如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称
How to list the names of all the files and directories in a folder using for loop in a batch file
我想在批处理脚本中使用 for 循环列出目录中的所有文件和目录。我该怎么做?
我在下面使用但没有用:
for /r %%I in (".") do ( ls -ltr '%%I') ## Listing only filenames and not directories name
任何帮助都是可观的。
谢谢!
创建两个循环,一个用于文件
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
.
如果你只想要一个目录和文件列表,递归地,怎么样:
dir /b/s "."
如果你想对每个流项目做一些特殊的事情,使用 for
循环,你可以这样做:
for /f "tokens=* delims=" %%i in ('dir /b/s "."') do ( echo "%%i" )
这里我用了echo
来回显,不过你可以随便放。
“在批处理脚本中使用 for 循环列出目录内的所有文件和目录。”你应该使用 DIR
命令。
如果您打开命令提示符 window,键入 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
循环中执行该命令,您应该首先打开命令提示符 window,键入 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
命令时,每个返回的行都是一个完全限定的路径,其中 none 可以以分号开头,因此您可以为此任务忽略 eol
。您显然希望返回所有内容,因此不需要 skip
返回任何行。 tokens
和 delimiters
是根据您要对结果执行的操作进行调整的,在这种情况下,您希望 'command' 返回的每一行的全部内容没有特定的拆分人物。您应该注意 tokens
默认情况下是 1
而 delims
默认情况下是 space 和水平制表符。因此,您应该规定不需要任何定界符,以便第一个标记是 'command' 每一行返回的所有内容。您很少需要 usebackq
选项,因此出于此答案和您的任务的目的,请忽略它。
现在把它们放在一起:
FOR /F "delims=" %%G IN ('DIR "Location" /A /B /S') DO command
最后,您可以对括号中的 DIR 命令的每个结果使用您想要的 DO 命令。该结果将保存在您的变量 %%G
.
中
为了仅查看每个结果,我们将使用 ECHO
命令,(您只需将其替换为您选择的命令)。请注意,由于 DIR
命令的每个结果都是一个文件或目录名称字符串,因此您通常应该将其用双引号引起来。
allObjects.cmd
FOR /F "delims=" %%G IN ('DIR "Location" /A /B /S') DO ECHO "%%G"
请记住根据需要替换 "Location"
,在 运行 Windows 命令脚本
之前
我想在批处理脚本中使用 for 循环列出目录中的所有文件和目录。我该怎么做?
我在下面使用但没有用:
for /r %%I in (".") do ( ls -ltr '%%I') ## Listing only filenames and not directories name
任何帮助都是可观的。
谢谢!
创建两个循环,一个用于文件
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
.
如果你只想要一个目录和文件列表,递归地,怎么样:
dir /b/s "."
如果你想对每个流项目做一些特殊的事情,使用 for
循环,你可以这样做:
for /f "tokens=* delims=" %%i in ('dir /b/s "."') do ( echo "%%i" )
这里我用了echo
来回显,不过你可以随便放。
“在批处理脚本中使用 for 循环列出目录内的所有文件和目录。”你应该使用 DIR
命令。
如果您打开命令提示符 window,键入 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
循环中执行该命令,您应该首先打开命令提示符 window,键入 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
命令时,每个返回的行都是一个完全限定的路径,其中 none 可以以分号开头,因此您可以为此任务忽略 eol
。您显然希望返回所有内容,因此不需要 skip
返回任何行。 tokens
和 delimiters
是根据您要对结果执行的操作进行调整的,在这种情况下,您希望 'command' 返回的每一行的全部内容没有特定的拆分人物。您应该注意 tokens
默认情况下是 1
而 delims
默认情况下是 space 和水平制表符。因此,您应该规定不需要任何定界符,以便第一个标记是 'command' 每一行返回的所有内容。您很少需要 usebackq
选项,因此出于此答案和您的任务的目的,请忽略它。
现在把它们放在一起:
FOR /F "delims=" %%G IN ('DIR "Location" /A /B /S') DO command
最后,您可以对括号中的 DIR 命令的每个结果使用您想要的 DO 命令。该结果将保存在您的变量 %%G
.
为了仅查看每个结果,我们将使用 ECHO
命令,(您只需将其替换为您选择的命令)。请注意,由于 DIR
命令的每个结果都是一个文件或目录名称字符串,因此您通常应该将其用双引号引起来。
allObjects.cmd
FOR /F "delims=" %%G IN ('DIR "Location" /A /B /S') DO ECHO "%%G"
请记住根据需要替换 "Location"
,在 运行 Windows 命令脚本