Как заменить варьирующуюся строку в файле через .cmd?
Есть файл, в котором присутствует фрагмент HOST='pc-name'
Вместо pc-name может быть что угодно.
Нужно найти этот фрагмент и заменить на HOST='%COMPUTERNAME%'
Делается через файл .cmd
Можно использовать только изначальные возможности голой командной строки.
Поскольку HOST='sadfqwersdfasdf' - единственный варьирующийся фрагмент в строке, я придумал адаптированный способ решения:
Считываешь строку, ищешь в ней слово HOST. Если нашел, записываешь в файл заранее заготовленную строку, где уже все как надо, безо всяких замен. Если не нашел - записываешь оригинальную строку.
Но дело в том, что я вообще не знаком с синтаксисом и не могу это реализовать. Изучать некогда, надо уже сейчас сделать.
Евгений: Инструментов для замены или выколупывания части файла нет) Если найдете, буду раз взглянуть на продукт упорства Для этого используют сторонние программы, WHS или PowerShell.
Если вам ехать, а не шашечки, то берите PowerShell или настройте у себя WSL (если *nix-way интереснее) и решайте свою задачу.
Толстый Лорри: но в решении, которое я предложил выше, не требуется ничего выколупывать. Вот был такой код, который работает :
setlocal enabledelayedexpansion
Set infile=config.ini
Set find=pc-name
Set replace=%COMPUTERNAME%
setlocal enabledelayedexpansion
set COUNT=0
for /F "eol=# tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP.TXT
)
copy %infile% %infile%.bak
move TMP.TXT %infile%
Он считывает построчно исходник и в каждой строке пытается заменить pc-name на имя компа, а потом записывает эту строку в новый файл.
Я, соответственно, придумал создать переменную, в которой уже будет нужная строка и после считывания строки проверять, есть ли в ней слово HOST. Если есть, то просто писать в файл не считанную строку, а заготовленную переменную. Если нет, то писать считанную строку. Проще некуда вроде. Но я разбился о синтаксис, не получается правильно составить:
setlocal enabledelayedexpansion
Set infile=config.ini
Set find=pc-name
Set replace=%COMPUTERNAME%
setlocal enabledelayedexpansion
set COUNT=0
for /F "eol=# tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=%LINE%
if "%LINE:HOST=HOZZZT%" neq %LINE% Echo !TMPR!>>TMP.TXT else Echo !LINE!>>TMP.TXT
)
copy %infile% %infile%.bak
move TMP.TXT %infile%
Для начала просто решил слово HOST заменить на HOZZZT на пробу, но файл вообще не исполняется. Проверку на наличие подстроки if "%LINE:HOST=HOZZZT%" neq %LINE% взял с другого форума. Мне просто нужен человек, который понимает в синтаксисе этого чудовища. Сама задача-то плёвая.
Толстый Лорри: нет, не на одной, бывает несколько. Вот например свойство HOST в такой строке:
dbParm=STATIC=0,lock='ru',APPNAME='SJK',HOST='pc-name'
Эту вещь нужно провернуть не разово на одном компе, а на многих периодически. Стоит программа на компах, есть настройки на серве. И эта задача нужна для того, чтобы при обновлении можно было на всех этих компах запустить .cmd и все настроилось. При этом ставить на них ничего нельзя, а насколько я понял, все эти павершелы и остальное надо ставить отдельно.