批处理脚本:将 .txt 列表中的内容合并到一个文件

Batch Script: Merge Content From .txt List to one file

在 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. 之前的所有内容
  3. 如果文件列表有一个层次结构(大纲),它可以 被保存,像这样:
#201508081213
###201609101219

#201508081213
TEXT
###201609101219
TEXT

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

@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 关于 !<!-- 中的已知用法。 使用 call 即使 < 和其他一些字符 可能会导致问题。

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

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

我在 std 流中留下了 3 条消息给你 通过 <!-- 测试了解操作。 标准流 1 是进入文件的输出。

操作

文件 output.txt 在回显文本到文件之前被删除。

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

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