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

时间:2013-10-01 04:34:00

标签: batch-file command-line cmd

我是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 

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

2 个答案:

答案 0 :(得分:6)

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

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 :(得分: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....以允许从任何位置执行,否则sourcedir中找到的文件名将是C:\My Documents\Data在当前目录中搜索以复制到输出中。

  • OP需要将分配给{{1}}的值更改为{{1}}