下面的Windows命令行代码分别将所有文本合并到一个文本文件中。
但是我想使用下面的命令行在文本的每一行中包含文本文件名。
for %f in (*.txt) DO type "%f" >> C:\Test\output.txt
如何实现?
答案 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;%%A
至echo %%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)
这是另一种依靠findstr完成大部分工作的方法。
在cmd提示符下:
For /F "Tokens=1-2*Delims=:" %A In ('FindStr /N "^" *.txt 2^>Nul')Do @(Echo(%A:%C)>>"C:\Test\output.txt"
如果从batch-file运行,请加倍 % 个字符。
该代码未经测试,行可能以:
字符开头的文件可能会出现问题,因此可能不适用于所有文件。
答案 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'