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

use*_*396 2 command-line cmd batch-file

我是一个新的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 
) 
Run Code Online (Sandbox Code Playgroud)

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

ECHO %%G >> Output.txt 
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何将它添加到当前脚本中,因此它将文件名添加到每一行,我没有找到任何示例的运气.

dbe*_*ham 6

如果您愿意使用文件名为每行添加前缀而不是将文件名放在最后,则可以从命令行使用简单的双线程.这个解决方案非常快.

cd "C:\My Documents\Data"
findstr "^" *.txt >output.log
Run Code Online (Sandbox Code Playgroud)

每行的格式为 filename:line content

输出文件使用与要合并的文件不同的扩展名非常重要.否则你冒着命令处理自己输出的风险!

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

cd "C:\My Documents\Data"
findstr "^" *.txt >..\output.txt
Run Code Online (Sandbox Code Playgroud)

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

findstr "^" "C:\My Documents\Data\*.txt" >output.txt
Run Code Online (Sandbox Code Playgroud)

上述解决方案的唯一缺点是,如果文本文件的最后一行不以换行符结尾,则可能出现问题.这将导致下一个文件的第一行被追加到前一个文件的最后一行.就像是: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
Run Code Online (Sandbox Code Playgroud)