我有一个批处理文件,我需要将一个变量写入文本文件的特定行,并覆盖该行中的所有内容。我有从代码中读取特定行的代码,也许我可以将其切换为也可以写入?
阅读行代码:
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!
我尝试添加类似的echo %variable1% > !v4!
,但它不起作用。
答案 0 :(得分:6)
我想通了!!以下是可能需要它的任何其他人的代码。
@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
答案 1 :(得分: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
/ v2
等变量仅用于与文件同步:当读取时,行存储在这些变量中,当任何变量存在时他们(变量)的变化,你只需立即调用saveVars
子程序。以下是如何使用它的示例:
…
SET v2=something
CALL :saveVars
…
SET v4=%somevar%
CALL :saveVars
…
如果文件很小,重写应该足够快。
答案 2 :(得分: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