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 

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

4

2 回答 2

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
于 2013-10-01T14:59:39.327 回答
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 
)
) 

请注意,在倒数第二行中,文件名和行由 a 分隔-,您可以将其替换为任何内容(不要忘记检查转义字符),或者如果您愿意,可以摆脱它。

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

莫娜

---- [edit:pw]
关闭 - 主要问题是(on the FOR ... %%Gline 在 - 之后的行上DO- 必须与DO.

  • 添加/a-dDIR以防止子目录名称匹配
  • 更改"usebackq tokens=1"为使用常规引号并允许文件名中有空格
  • 将目标目录名称分配给sourcedir变量并包含%sourcedir%在两个FOR语句中以允许从任何地方执行,否则C:\My Doc....将在当前目录中搜索找到的文件名以复制到输出中。

  • OP需要更改分配给sourcedir的值C:\My Documents\Data

于 2013-10-01T06:44:05.143 回答