制作for循环一次读取2行文本文件

时间:2016-02-25 17:26:45

标签: regex variables batch-file for-loop replace

我有一组文件夹,每个文件夹中都有一个同名的txt文件。他们的路径是

C:\Test\Salford_xxx\MenuSettings.txt
C:\Test\Salford_xxx\MenuSettings.txt
C:\Test\Salford_xxx\MenuSettings.txt

其中xxx是随机3位数字。我希望使用名为input.txt的文本文件更改每个文件的第1行,该文件具有替换每个文件的第1行的路径和行。它看起来像这样。

C:\TEST\SALFORD_001\MENUSETTINGS.TXT
AppName: "This needs replacing 1"
C:\TEST\SALFORD_011\MENUSETTINGS.TXT
AppName: "This needs replacing 2"
C:\TEST\SALFORD_345\MENUSETTINGS.TXT
AppName: "This needs replacing  3"
C:\TEST\SALFORD_761\MENUSETTINGS.TXT
AppName: "This needs replacing 4"
C:\TEST\SALFORD_768\MENUSETTINGS.TXT
AppName: "This needs replacing 5"
C:\TEST\SALFORD_999\MENUSETTINGS.TXT
AppName: "This needs replacing 6"

我写了一个for循环,它将路径和替换放在变量中,这有效:

for /F "delims=" %%a in ('findstr /R /I "Salford" Input.txt') do (set "FilePath=%%a" echo %FilePath%)
for /F "delims=" %%b in ('findstr /R /I "AppName" Input.txt') do (set "NewName=%%b" echo %NewName%)

AppName是一个始终位于第一行的单词,因此用于搜索。 这是替换每个文件行的脚本。

set "search=Appname"
set "replace=%NewName%"
set "newfile=NewOutput.txt"

(for /f "delims=" %%i in (%FilePath%) do (
set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>"%newfile%"
move "%newfile%" "%FilePath%"

然而,循环继续到Salford_999文件夹中的最后一项,只是编辑该文件。我怎样才能读取input.txt的前2行,进行替换然后循环到接下来的两行等等?

由于

1 个答案:

答案 0 :(得分:1)

我不明白您的代码如何使用您的规范。例如,您的" for循环将路径放入变量"将所有路径分配给相同的变量,因此当for结束时,变量具有最后一个值。另外,我不明白" AppName"字符串文字取自在第二个findstr中使用时的字符串。最后,如果文件中的input.txt文件中没有相应的行,会发生什么?

另一种方法是将input.txt文件作为一系列奇数/偶数行处理,然后处理奇数行中描述的每个文件;这可能会导致更简单的解决方案:

@echo off
setlocal EnableDelayedExpansion

rem Process odd and even lines from input.txt file:
set "FilePath="
for /F "delims=" %%a in (input.txt) do (
   if not defined FilePath (  rem Odd line...
      rem Assign each odd line to "FilePath" variable
      set "FilePath=%%a"
   ) else (  rem Even line...
      rem Process this file, if it exists
      if exist "!FilePath!" (
         rem Block to enclose output to new file
         > newfile (
            rem The first line in new file is this even line in input.txt file
            echo %%a
            rem Copy all lines from this file, excepting the first one
            more +1 "!FilePath!"
         )
         move /Y newfile "!FilePath!"
      )
      set "FilePath="
   )
)