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

时间:2018-08-08 15:56:52

标签: batch-file batch-processing

在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

现在这是做的:

  • 读取 filelist.txt ,其中包含.txt文件的名称,例如: 20180808173105 (不带“ .txt”
  • 搜索这些文件: 20180808173105.txt
  • 将文件名(不带“ .txt”)复制到 output.txt
  • 插入文件内容
  • 插入两个空白行
  • 对于以 filelist.txt
  • 命名的所有文件重复整个过程
  • ->效果很好! (或者您看到任何异常可能会导致故障吗?)

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

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

#201508081213
TEXT
###201609101219
TEXT

我正在使用此工具将Outlines(仅使用文件名)转换为用于撰写文章和博客的粗略文本初稿

1 个答案:

答案 0 :(得分:0)

@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个标题的位置未知。

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

操作

将文件output.txt回显到文本之前将其删除。

第一个for循环读取filelist.txt文件的每一行。 嵌套的for循环使用通配符获取文件名。 每个用于标记call的{​​{1}}都传递一个文件名的参数。

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