首页 > 解决方案 > 批处理脚本:将 .txt 列表中的内容合并到一个文件

问题描述

在 Windows 10 上,我有这个.bat

@echo off

for /f "delims=" %%i in (filelist.txt) do (
echo %%~nxi >> output.txt
type "%%~ni*" >> output.txt
echo. >> output.txt
echo. >> output.txt
)
Exit

现在这样做是:

这将根据列表插入文本文件的全部内容。我可以修改它,所以

  1. 不是 .txt 的全部内容,而是仅插入其中的一部分? 例如,从“title:”之后到之前的所有内容"<!--"
  2. 如果文件列表具有层次结构(大纲),则可以保留它,如下所示:
#201508081213
###201609101219

#201508081213
TEXT
###201609101219
TEXT

我正在使用它来将大纲(仅使用文件名)转换为用于撰写文章和博客的粗略初稿

标签: batch-filebatch-processing

解决方案


@echo off

2> output.txt echo.

@>&3 (
    echo Debug Information
    echo -----------------
)

for /f "delims=" %%A in (filelist.txt) do (
    for %%B in ("%%~nA*") do call :read "%%~B"
) >> output.txt

exit /b

:read
setlocal
set "line="

echo(%~nx1

for /f "usebackq delims=" %%C in ("%~1") do (
    set "line=%%C"

    for /f "tokens=*" %%D in ('call echo "%%line:~0,4%%"') do (
        @>&3 echo File: "%~1"  Test: %%D == "<!--"
        if %%D == "<!--" (
            @>&3 echo Found: "<!--"
            echo.
            echo.
            exit /b 0
        )
    )

    call echo(%%line%%
)

echo.
echo.
exit /b 0

笔记

不是这项任务的最佳语言。不得不避免 enabledelayedexpansion已知使用!in <!--call即使使用<,其他一些字符也可能会导致问题。

for /f循环通常不会处理空行,所以希望这不是问题。

层次结构取决于filelist.txt. 文档的结构可能会有所不同,我无法考虑正确的顺序可能是什么。使用通配符会产生一些疑问。#a将找到一个文件名#a1#a2因此 3 个标题的位置是未知的。

我在 std 流中留下了 3 条消息,供您了解<!--测试操作。标准流 1 是到文件的输出。

手术

在将文本回显到文件之前,该文件output.txt被擦除。

第一个for循环读取文件的每一行filelist.txt。嵌套for循环使用通配符获取文件名。每个callto 标签都:read传递一个文件名的参数。

在 的标签中:read,文件名被回显。循环从for文件名中读取行。每一行都存储在名为 的变量中line。嵌套for循环将用于call echo扩展变量line并回显第一个 4 个字符。进行比较以测试是否是<!--,如果 是,则使用echo2 个换行符,然后退出标签。如果没有,echo每一行。echo退出前在标签末尾完成 2 个换行符。


推荐阅读