【问题标题】:Windows Command batch script to add filename to end of each row in a merged text fileWindows 命令批处理脚本将文件名添加到合并文本文件中每一行的末尾
【发布时间】:2013-10-01 04:34:00
【问题描述】:

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


    【解决方案1】:

    如果您愿意在每一行前面加上文件名而不是将文件名放在末尾,那么有一个简单的两行代码可以从命令行工作。此解决方案速度极快。

    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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如前所述,此批处理解决方案将删除空行和以; 开头的行。这两个限制都可以通过更多代码来解决。但是使用 FOR /F 批处理解决方案的行长度限制为 ~8192 个字符。如果内容很多,也很慢。
      猜你喜欢
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2017-11-08
      • 1970-01-01
      相关资源
      最近更新 更多