如何将目录中的所有* .txt文件写入一个文件,在输出文件的每一行中使用源文件名?

时间:2019-05-04 17:51:58

标签: windows batch-file cmd

下面的Windows命令行代码分别将所有文本合并到一个文本文件中。
但是我想使用下面的命令行在文本的每一行中包含文本文件名。

for %f in (*.txt) DO type "%f" >> C:\Test\output.txt

如何实现?

3 个答案:

答案 0 :(得分:0)

此批处理文件可用于此任务。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "OutputFile=C:\Test\output.txt"
del "%OutputFile%" 2>nul
for %%I in ("*.txt") do for /F usebackq^ delims^=^ eol^= %%A in ("%%I") do >>"%OutputFile%" echo %%~nxI;%%A
endlocal

此批处理文件将在当前目录中找到的所有* .txt文件的所有非空行写入文件C:\Test\output.txt,该文件带有文件名和文件扩展名,但没有文件路径,并且每行开头的分号。

运行上面的批处理文件时,当前目录不应为C:\Test。否则,下面的批处理文件将带有附加的 IF ,以防止处理与文件名和文件名相同的输出扩展名的输出文件。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "OutputFile=C:\Test\output.txt"
del "%OutputFile%" 2>nul
for %%I in ("*.txt") do if /I not "%%~fI" == "%OutputFile%" for /F usebackq^ delims^=^ eol^= %%A in ("%%I") do >>"%OutputFile%" echo %%~nxI;%%A
endlocal

下面的批处理文件还可用于读取行,并将它们写入文件名和分号的输出文件中。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "OutputFile=C:\Test\output.txt"
del "%OutputFile%" 2>nul
for %%I in ("*.txt") do if /I not "%%~fI" == "%OutputFile%" (
    for /F delims^=^ eol^= %%A in ('%SystemRoot%\System32\findstr.exe /N "^" "%%I" 2^>nul') do (
        set "Line=%%A"
        setlocal EnableDelayedExpansion
        >>"%OutputFile%" echo %%~nxI;!Line:*:=!
        endlocal
    )
)
endlocal

分别将echo %%~nxI;%%Aecho %%A;%%~nxI修改为echo %%~nxI;!Line:*:=!echo !Line:*:=!;%%~nxI,以在输出文件的每一行末尾使用分号后的文件名。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • set /?
  • setlocal /?

请参阅How to read and print contents of text file line by line?,其中包含所用代码的完整说明。可以很容易地看出Windows命令处理器是为执行命令和应用程序而不是为处理文本文件而设计的。

答案 1 :(得分:0)

这是另一种依靠完成大部分工作的方法。

提示符下:

For /F "Tokens=1-2*Delims=:" %A In ('FindStr /N "^" *.txt 2^>Nul')Do @(Echo(%A:%C)>>"C:\Test\output.txt"

如果从运行,请加倍 个字符。

该代码未经测试,行可能以:字符开头的文件可能会出现问题,因此可能不适用于所有文件。

答案 2 :(得分:0)

我希望Select-String将做您想要的事情。这是一个实现相同代码的.bat文件脚本。

powershell -NoLogo -NoProfile -Command ^
    "$logfile = 'C:\src\t\master.txt';" ^
    "if (Test-Path -Path $logfile) { Remove-Item -Path $logfile };" ^
    "Select-String -Pattern '^'  -Path 'y.txt' -Exclude $logfile |" ^
        "ForEach-Object { '{0}:{1}' -f ((Split-Path $_.Path -Leaf), $_.Line) } |" ^
        "Out-File -FilePath 'C:\src\t\master.txt' -Encoding ascii"

或者,可以创建.ps1脚本文件并从.bat脚本文件中调用。

=== doit.ps1

$logfile = 'C:\src\t\master.txt'
if (Test-Path -Path $logfile) { Remove-Item -Path $logfile }

Select-String -Pattern '^'  -Path 'y.txt' -Exclude $logfile |
    ForEach-Object { '{0}:{1}' -f ((Split-Path $_.Path -Leaf), $_.Line) } |
    "Out-File -FilePath 'C:\src\t\master.txt' -Encoding ascii"

=== doit.bat

powershell -NoLogo -NoProfile -File '%~dp0doit.ps1'