使用Windows批处理文件向文本文件添加新行

31

我有一个文本文件,里面有200多行,我只想在第4行之前添加一行。我使用的是Windows XP。

输入前的示例文本文件:

header 1
header 2
header 3
details 1
details 2

输出后:

header 1
header 2
header 3
<----- This is new line ---->
details 1
details 2

1
我认为这里接受的答案不正确。请参见 https://stackoverflow.com/a/31934142/4294399 - General Grievance
4个回答

42

我相信你正在使用

echo Text >> Example.txt 

函数?

如果是这样,答案就是在echo后面直接添加一个"."(点),什么都不需要放。

示例:

echo Blah
echo Blah 2
echo. #New line is added
echo Next Blah

1
谢谢您的回复,詹姆斯·戴森。 我需要编辑现有文件而不是新文件。 - newbie18
4
使用 >> 将输出重定向到文件,将追加到文件的末尾。如果只使用一个尖括号,则输出将覆盖现有文件(如果存在),或者创建一个新文件(如果不存在)。 - Ahmad
6
我不太确定这个回答是否解答了问题。看起来文本文件已经存在,而提问者只是想在中间插入一行,而不是在末尾插入。 - General Grievance

4

声明:以下解决方案不会保留行尾制表符。


如果您知道文本文件中的确切行数,请尝试以下方法:

@ECHO OFF
SET origfile=original file
SET tempfile=temporary file
SET insertbefore=4
SET totallines=200
<%origfile% (FOR /L %%i IN (1,1,%totallines%) DO (
  SETLOCAL EnableDelayedExpansion
  SET /P L=
  IF %%i==%insertbefore% ECHO(
  ECHO(!L!
  ENDLOCAL
)
) >%tempfile%
COPY /Y %tempfile% %origfile% >NUL
DEL %tempfile%

这个循环会逐行读取原始文件并输出它们。输出会被重定向到一个临时文件。当到达某一行时,在它之前输出一个空行。

完成后,原始文件会被删除,而临时文件则被赋予原始文件的名称。


更新

如果事先不知道行数,可以使用以下方法来获取它:

FOR /F %%C IN ('FIND /C /V "" ^<%origfile%') DO SET totallines=%%C

(这行代码仅替换上面脚本中的SET totallines=200行。)

该方法有一个小缺陷:如果文件以空行结尾,则结果将是实际行数减一。如果您需要解决方法(或只是想保险起见),您可以使用此答案中描述的方法。


这个脚本我保存为run1.bat。我尝试运行它,但是出现了错误消息(命令的语法不正确)。文件重命名为after.txt。 - newbie18
  1. 格式不正确<br/> 例如:
输入 header 1<--这里有制表符分隔的格式--><--这里有制表符分隔的格式--> header 2<--这里有制表符分隔的格式--><--这里有制表符分隔的格式--> header 3<--这里有制表符分隔的格式--><--这里有制表符分隔的格式--> details 1 details 2 输出: header 1<--缺少制表符分隔--><--缺少制表符分隔--> header 2<--缺少制表符分隔--><--缺少制表符分隔--> header 3<--缺少制表符分隔--><--缺少制表符分隔-->details 1 details 2 </pre>
- newbie18
我也测试了这个脚本,没有发现任何错误。至于你的问题#2...嗯,使用批处理脚本处理如此敏感的文件就像用联合收割机修剪草坪一样:可能是可行的,但需要非常彻底的调整。我重新测试了脚本,它确实删除了尾随制表符。到目前为止,我不知道如何解决这个问题。也许其他人可以。或者你可以考虑使用其他工具。你也可以在超级用户上试试运气。 - Andriy M
这是脚本。@ECHO OFF <br> SET origfile="C:\Documents and Settings\user\Desktop\test1\before.txt" <br> SET tempfile="C:\Documents and Settings\user\Desktop\test1\after.txt" <br> SET insertbefore=4 <br> FOR /F %%C IN ('FIND /C /V "" ^<%origfile%') DO SET totallines=%%C <br><%origfile% (FOR /L %%i IN (1,1,%totallines%) DO ( <br> SETLOCAL EnableDelayedExpansion <br> SET /P L= <br> IF %%i==%insertbefore% ECHO( <br> ECHO(!L! <br> ENDLOCAL <br> )<br> ) >%tempfile% <br> DEL %origfile% <br> RENAME %tempfile% %origfile% <br> pause <br> - newbie18
我现在明白了,谢谢。请像我的更新答案中那样更改脚本的最后两行。问题是RENAME命令的第二个参数应该只是一个名称,没有路径。 - Andriy M

3

您可以使用:

type text1.txt >> combine.txt
echo >> combine.txt
type text2.txt >> combine.txt

或者类似于这样的东西:
echo blah >> combine.txt
echo blah2 >> combine.txt
echo >> combine.txt
echo other >> combine.txt

4
在Windows中这样做行不通,因为不跟随任何内容的echo命令实际上会打印出echo状态,例如“ECHO is ON”。 - mtalexan
3
虽然这篇文章有点旧,但是如果有人想在Windows中使用这个解决方法,请使用" echo. >> combine.txt"命令。在echo命令后添加一个额外的“点”字符可以解决出现"ECHO is ON"问题的情况。 - Saneesh kumar
@Saneeshkumar,你应该把它变成一个答案。 - oxygen

-2
假设您想要插入一行特定的文本(不是空行):
@echo off
FOR /F %%C IN ('FIND /C /V "" ^<%origfile%') DO SET totallines=%%C
set /a totallines+=1

@echo off
<%origfile% (FOR /L %%i IN (1,1,%totallines%) DO (
  SETLOCAL EnableDelayedExpansion
  SET /p L=
  IF %%i==%insertat% ECHO(!TL!
  ECHO(!L!
  ENDLOCAL
)
) >%tempfile%

COPY /Y %tempfile% %origfile% >NUL

DEL %tempfile%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接