3

我对批处理文件完全陌生,并且一直在修改简单的命令。我已经想出了如何将文本移动到另一个文件、查找一行等,但我希望能够将几行文本添加到一个已经存在的文本文件中。这是我到目前为止所拥有的:

@ECHO OFF
CD C:\Documents and Settings\SLZ1FH\Desktop\New Folder
FOR /F "tokens=*" %%A IN (Examples.txt) DO (
  ECHO %%A
  IF %%A=="Ex3 3"(
    TYPE Line_to_add.txt >> Examples.txt
  )
)

如果 Examples.txt 包含:

  • 防爆1 1
  • Ex2 2
  • Ex3 3
  • 防爆 4 4
  • Ex5 5

Line_to_add.txt 包含:

  • 这是一条线
  • 这是另一条线!

我希望输出为:

  • 防爆1 1
  • Ex2 2
  • Ex3 3
  • 这是一条线
  • 这是另一条线!
  • 防爆 4 4
  • Ex5 5

蒂亚:)

解决方案

@ECHO OFF
FOR /F "tokens=*" %%A IN (Examples.txt) DO (
  ECHO %%A
  IF "%%A" EQU "Ex3" (
    TYPE Line_to_add.txt
  )
) >> temp.txt
move /y temp.txt Examples.txt
4

3 回答 3

6

您从不费心提出问题,但我可以看到您的代码存在一些问题。

1)您的 IF 语句被破坏,因为左括号被视为要比较的字符串的一部分。你必须在你的父母之前至少有一个空格。

2)您的比较永远不会找到匹配项,因为引号包含在比较中。你的值有空格,所以比较的两边都应该用引号引起来。

3) 您正在尝试插入到现有文件中,但无法正常工作。您的代码只需将文本附加到文件末尾即可。您必须将整个所需结果写入一个新的临时文件,然后将该临时文件移动到原始名称。

首先,我将忽略文件的更新并展示如何将正确的输出显示到屏幕上。

@ECHO OFF
FOR /F "tokens=*" %%A IN (Examples.txt) DO (
  ECHO %%A
  IF "%%A" EQU "Ex3 3" (
    TYPE Line_to_add.txt
  )
)

然后将输出定向到文件并将文件移动到所需的名称就很简单了。

@ECHO OFF
(
  FOR /F "tokens=*" %%A IN (Examples.txt) DO (
    ECHO %%A
    IF "%%A" EQU "Ex3 3" (
      TYPE Line_to_add.txt
    )
  )
) >temp.txt
move /y temp.txt Examples.txt

学习批处理语法和技术的好资源:

1) 每个命令都有在线帮助。只需/?在命令名称后添加选项即可。例如,DIR /?

2)这里有一些信息很好的网站

http://www.dostips.com/
http://judago.webs.com/
http://www.robvanderwoude.com/batchfiles.php

于 2012-05-07T16:24:40.120 回答
0
1) create new temp file
2) output to temp
3) delete original
4) rename temp to original

想不出更好的了。

于 2012-05-07T16:06:53.077 回答
0

使用FOR /F迭代文件中的行,使用SET /a创建一个计数器。

对于文件中的每一行,调用一个增加计数器的子程序并对其进行测试。如果它有一些价值,请像目前所做的那样插入新数据。

这是您的脚本,已更新。您可以使用计数器或文件的内容来触发插入。它还处理输入和输出文件具有相同名称的情况。

@ECHO OFF
set INFILE=Examples.txt
set OUTFILE=Output.txt
set MIXFILE=Line_to_add.txt

set OUTFILEOLD=%OUTFILE%
if NOT "%INFILE%"=="%OUTFILE%" got no_tmp1
set OUTFILE=%OUTFILE%.tmp
:no_tmp1

set counter=0
FOR /F "tokens=*" %%A IN (%INFILE%) do call :process_line %%A

set OUTFILE=%OUTFILEOLD%
if NOT "%INFILE%"=="%OUTFILE%" goto no_tmp2
copy %OUTFILETMP% %OUTFILE%    
:no_tmp2

goto exit

:process_line
set /a counter=counter+1
echo Line %counter% = %*
REM ##IF "%counter%"=="3" goto :adding_line 
IF /i "%1"=="Ex3" goto :adding_line
echo %* >> %OUTFILE%
goto :EOF

:adding_line
echo Adding line
type %MIXFILE% >> %OUTFILE%
goto :EOF

:exit
echo DONE
于 2012-05-07T16:03:10.283 回答