2012-05-21 2 views
0

У меня есть командный файл, где мне нужно записать переменную в определенную строку текстового файла и переопределить все готовое в этой строке. У меня есть код для чтения определенных строк из файла, может быть, я мог бы переключить его, чтобы также написать?Запись переменной пакета в определенную строку в текстовом файле

Чтение строки кода:

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! что-то подобное, но это не работает.

ответ

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 
+0

Хорошая работа, выясняя это! Не уверен, почему это не сработало для вас с одним перенаправлением для всего цикла, но хорошо сделано в любом случае. –

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 
+0

Я понятия не имею, что вы делаете, в этом я просто хочу, чтобы командный файл менял определенную строку в текстовом файле, который уже существует. Скажем, строка 5 текстового файла приветствует. И я хотел бы, чтобы пакет принимал переменную и записывал строку 5 с содержимым переменных. Это все. –

+0

Вы имеете в виду, что 'variables.txt' не является файлом, где нужно заменить строку? –

+0

Это ... но я не хочу создавать новый файл. Я вижу, что вы делаете, но я чувствую, что должен быть лучший способ, кроме создания нового файла:/ –

1

Другой вариант может заключаться в том, чтобы полностью переписать файл. Вот как это сделать:

: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 
… 

Если файл невелик, переписывание должно быть достаточно быстрым.

Смежные вопросы