Windows 命令批处理脚本将文件名添加到合并文本文件中每行的末尾

问题描述 投票:0回答:3

我是 Windows 命令行脚本的新手。 我有一个批处理文件,用于将多个文本文件合并为一个。不过,我希望能够将行所在的文本文件的名称添加到合并文件中每行的末尾。

这是我当前正在使用的脚本:

@ECHO OFF
ECHO Creating %1...
FOR /F "usebackq tokens=1" %%G IN (`DIR /B "C:\My Documents\Data\*.txt"`) DO         
(
ECHO Adding %%G
ECHO. >> Output.txt
TYPE %%G >> Output.txt 
) 

现在我知道要将文件名放入输出文件中,我需要使用:

ECHO %%G >> Output.txt 

但是我不确定如何将其添加到当前脚本中,因此它将文件名添加到每一行,但我没有找到任何示例。

batch-file command-line cmd
3个回答
8
投票

如果您愿意在每一行前面加上文件名而不是将文件名放在末尾,那么可以从命令行使用一个简单的两行代码。这个解决方案非常快。

cd "C:\My Documents\Data"
findstr "^" *.txt >output.log

每行的格式为

filename:line content

输出文件使用与要合并的文件不同的扩展名非常重要。否则,您将面临命令处理其自身输出的风险!

另一个选项是确保输出到不同的文件夹,也许是父文件夹:

cd "C:\My Documents\Data"
findstr "^" *.txt >..\output.txt

或者,如果您愿意在输出中包含每个文件的完整路径,请确保当前目录与源目录不同,然后使用

findstr "^" "C:\My Documents\Data\*.txt" >output.txt

上述解决方案的唯一缺点是,如果文本文件的最后一行不以换行符结尾,则可能会出现问题。这将导致下一个文件的第一行被附加到前一个文件的最后一行。比如:

FILENAME1:last line without newlineFILENAME2:first line of next file

一个简单的脚本可以将换行符附加到最后一行缺少换行符的文件中。然后可以安全地将文件与每行的文件名前缀合并:

@echo off
if "%~1" equ ":FindFiles" goto :FindFiles

cd "C:\My Documents\Data"

:: Append newline to text files that are missing newline on last line
for /f "eol=: delims=" %%F in ('"%~f0" :FindFiles') do echo(>>"%%F"

:: Merge the text files and prefix each line with file name
findstr "^" *.txt >output.log

exit /b


:FindFiles
setlocal enableDelayedExpansion

:: Define LF to contain a newline character
set lf=^


:: The above 2 blank lines are critical - do not remove

:: List files that are missing newline on last line
findstr /vm "!lf!" *.txt

1
投票

您需要在文件中单独添加每一行:

@ECHO OFF
ECHO Creating %1...
SET "sourcedir=c:\sourcedir"
FOR /F "delims=" %%G IN ('DIR /B /a-d "%sourcedir%\*.txt"') DO (
ECHO Adding %%G
ECHO. >> Output.txt
for /f "usebackq tokens=*" %%a in ("%sourcedir%\%%~G") do (
Echo %%a - %%G >> Output.txt 
)
) 

请注意,在倒数第二行中,文件名和行由

-
分隔,您可以将其替换为任何内容(不要忘记检查转义字符),或者如果您愿意,可以删除它。

我确信这会起作用,但如果不起作用,请告诉我错误消息,我可以为您修复它。

莫娜

---- [编辑:pw]
关闭 - 主要问题是

(
线上的
FOR ... %%G
位于
DO
之后的线上 - 必须与
DO
在同一行。

  • /a-d
    中添加了
    DIR
    以防止子目录名称匹配
  • 更改了
    "usebackq tokens=1"
    以使用常规引号并允许文件名中包含空格
  • 将目标目录名称分配给

    sourcedir
    变量,并在两个
    %sourcedir%
    语句中包含
    FOR
    以允许从任何地方执行,否则将在当前目录中搜索
    C:\My Doc....
    中找到的文件名以复制到输出中.

  • OP 需要将分配给

    sourcedir
    的值更改为
    C:\My
    Documents\Data


0
投票

是否可以调整提供的答案以包括合并子文件夹内文本文件的内容和文件名的可能性?

© www.soinside.com 2019 - 2024. All rights reserved.