2

我正在尝试在 Windows 命令提示符中使用嵌套的 for 循环,在该循环中,我转到指定文件夹中的每个子文件夹,以将其中的所有文本文件连接到一个文本文件中。我正在尝试使用

FOR /F  IN (.) DO (for %f in (*.dat) do type “%f” >> aggregate.txt)

但它不工作。谁来帮帮我!

4

2 回答 2

2

我不确定您是否要连接 .txt 或 .dat 文件,但这应该适用于 .dat

(for /r %f in (*.dat) do @type "%f")>aggregate.txt

HELP FOR从命令行键入以获取有关 FOR 语句的多种形式的更多信息。

将整个命令括在括号中并只执行一次重定向而不是为每个文件执行附加重定向更有效。

编辑-评论中细化要求的解决方案:每个文件夹一个聚合

如果需要,首先删除所有现有的 aggregate.txt 文件

del /s aggregate.txt

那么以下应该会给你你想要的结果

for /r %F in (*.dat) do @type "%F" >>"%~dpF\aggregate.txt"

请注意,如果将命令放在批处理文件中,则必须将 FOR 变量前的百分比加倍。例如,%F在命令行上就需要%%F在一个批处理文件中。

于 2012-06-04T22:42:13.600 回答
1

只需使用for /r ...遍历给定目录的所有子目录。例子:

for /r %f in (*.dat) do @type %d >> aggregate.txt

不需要嵌套。交替:

(for /r %f in (*.dat) do @type %d) >> aggregate.txt

您可以使用/d而不是/r仅在层次结构中深入一层并仅列出文件夹(而不是与某个通配符匹配的文件)。在“手动”进行目录遍历时,这可以用作拼图的一部分。但是,考虑到 NT 脚本中变量扩展(循环内部,有和没有子)的问题,我建议您坚持使用简单的解决方案。我过去曾用它来清理脚本,但for /r现在已经有一段时间了。


这应该让你开始

@echo off
for /r %%i in (*.dat) do @call :ConcatFolder "%%i"

:ConcatFolder
if "" == "%1" goto :EOF
setlocal ENABLEEXTENSIONS
set FLDR=%~dp1
type "%1" >> "%FLDR%aggregate.txt"
endlocal & goto :EOF
于 2012-06-04T23:36:20.533 回答