Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file Windows命令批处理脚本,用于将文件名添加到合并文本文件中每行的末尾_Batch File_Command Line_Cmd - Fatal编程技术网

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

Batch file Windows命令批处理脚本,用于将文件名添加到合并文本文件中每行的末尾,batch-file,command-line,cmd,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. >> Outpu

我需要一个新的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 

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

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

@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
    添加到
    目录
    ,以防止子目录名称匹配
  • 更改了
    “usebackq tokens=1”
    以使用常规引号并在文件名中允许空格
  • 将目标目录名分配给
    sourcedir
    变量,并将
    %sourcedir%
    包含在
    FOR
    语句中,以允许从任何位置执行,否则将在当前目录中搜索
    C:\My Doc….
    中找到的文件名,以便复制到输出中

  • OP需要将分配给
    sourcedir
    的值更改为
    C:\My
    文档\数据


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

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:没有换行符的最后一行filename2:下一个文件的第一行

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

@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

如前所述,此批处理解决方案将剥离空行和以
开头的行。这两个限制都可以通过更多代码来解决。但对于FOR/F批处理解决方案,行长度限制为~8192个字符。如果内容太多,则速度也会很慢。