我正在尝试在Windows命令提示符下有一个嵌套的for循环,我转到指定文件夹中的每个子文件夹,将其中的所有文本文件连接成一个文本文件。我正在尝试使用
FOR /F IN (.) DO (for %f in (*.dat) do type “%f” >> aggregate.txt)
但它不起作用。有人帮帮我!
答案 0 :(得分: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
。
答案 1 :(得分: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