1

我有一个批处理文件,我需要将一个变量写入文本文件的特定行并覆盖该行中所有准备好的内容。我有从文件中读取特定行的代码,也许我可以把它切换到也写?

读取行代码:

setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in (variables.txt) do (
set /a N+=1
set v!N!=%%a
)
set variable1=!v1!
set variable2=!v2!
set variable3=!v3!
set variable4=!v4!

我试图添加%variable1% > !v4!类似的回声,但它不起作用。

4

3 回答 3

9

我想到了!!这是其他任何可能需要它的人的代码。

@echo off
setlocal enableextensions enabledelayedexpansion

set inputfile=variables.txt

set tempfile=%random%-%random%.tmp

copy /y nul %tempfile%

set line=0

for /f "delims=" %%l in (%inputfile%) do (
    set /a line+=1
    if !line!==4 (
        echo WORDS YOU REPLACE IT WITH>>%tempfile%
    ) else (
        echo %%l>>%tempfile%
    )
)

del %inputfile%
ren %tempfile% %inputfile%

endlocal
于 2012-05-22T12:37:56.150 回答
2

另一种选择可能是完全覆盖文件。这是执行此操作的部分:

:saveVars
(
ECHO %v1%
ECHO %v2%
ECHO %v3%
ECHO %v4%
ECHO %v5%
) >variables.txt
GOTO :EOF

也就是说,如果行数是固定的并且事先已知。如果没有,您可能希望在示例代码中存储增量的最后一个值,并且在保存变量时,像这样使用它:

:saveVars
SETLOCAL EnableDelayedExpansion
(
  FOR /L %%i IN (1,1,%N%) DO (ECHO !v%%i!)
) >variables.txt
ENDLOCAL
GOTO :EOF

我在这里假设v1/ v2etc. 变量仅用于与文件同步:读取时,行存储在这些变量中,并且当其中任何一个(变量)发生更改时,您只需调用saveVars子例程立即地。这是一个如何使用它的示例:

…
SET v2=something
CALL :saveVars
…
SET v4=%somevar%
CALL :saveVars
…

如果文件很小,重写应该足够快。

于 2012-05-22T12:51:42.137 回答
1

不确定我是否正确理解了所有内容,但是如果您想用批处理脚本替换文本文件的现有部分,您需要先将所有内容(包括更改的部分)写入新文件,然后删除原始文件并将新文件重命名为原始名称。

除非我遗漏了什么,否则我真的看不出将所有内容读入变量的意义。您可以简单地遍历将它们一一写入新文件的行,并在此过程中用替换文本替换特定行的内容:

setLocal EnableDelayedExpansion
>newFile.txt (
  for /f "tokens=* delims= " %%a in (variables.txt) do (
    set /a N+=1
    if !N! == 4 (ECHO substitute text) ELSE ECHO %%a
  )
)
del variables.txt
rename newFile.txt variables.txt

如果替代文本又必须从其中一行派生,您可以执行以下操作:

setLocal EnableDelayedExpansion
>newFile.txt (
  for /f "tokens=* delims= " %%a in (variables.txt) do (
    set /a N+=1
    if !N! == 1 SET subst_text=%%a
    if !N! == 4 (ECHO !subst_text!) ELSE ECHO %%a
  )
)
del variables.txt
rename newFile.txt variables.txt
于 2012-05-21T21:00:39.640 回答