Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Автоматическое редактирование файла.config

Ответить
Настройки темы
Любой язык - [решено] Автоматическое редактирование файла.config

Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день.
Вообщем создал инсталятор которые распаковывает приложение в определенную папку. Приложение периодически обновляется (добавляются новые библиотеки и т.д.) в связи с чем в конфигурационный файлик добавляются новые строки. Так как приложение находится на разных объектах и имеет разные коммутационные настройки то запихнуть в инсталятор общий файлик конфигурации я не могу. Идея в том что бы при запуске инсталятора запускался как нибудь .bat или другое средство, который бы добавлял в тестовый фаил нужные строчки, при этом не трогая остальную часть файла.
Конфигурационный файл выглядит примерно так(маленькая часть):
<add key="SkipPreSelect" value="false" />
<add key="RefundLockTime" value="20" />
<add key="UseSverkaDiff" value="false" />
</appSettings>
т.е. новые параметры нужно добавлять между строк <add key="UseDiff" value="false" /> и </appSettings>, а так же учесть что если данные параметры есть то их трогать не нужно.
Подскажите каким способом это можно реализовать? и если есть готовые решения то я буду рад их принять
Заранее большое спасибо.

Отправлено: 14:28, 12-02-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата Armsinglom:
Вообщем создал инсталятор которые распаковывает приложение в определенную папку. »
Чем именно создавали?

Цитата Armsinglom:
добавлял в тестовый фаил нужные строчки, при этом не трогая остальную часть файла. »
Образец реального файла упакуйте в архив, каковой приложите к сообщению.

Цитата Armsinglom:
Конфигурационный файл выглядит примерно так(маленькая часть): »
Этого недостаточно. Сделайте то, что я прошу в предыдущем абзаце.

Цитата Armsinglom:
т.е. новые параметры »
Какие именно «новые параметры»?

Цитата Armsinglom:
Подскажите каким способом это можно реализовать? »
Надо полагать, конфигурационный файл — это xml-файл. Посему проще и надёжнее всего будет использовать WSH или PoSH (в случае отсутствия систем на XP и ниже).

Отправлено: 14:45, 12-02-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать



HTML код: Выделить весь код
Чем именно создавали?

Smart Install Maker 5.04

HTML код: Выделить весь код
Образец реального файла упакуйте в архив, каковой приложите к сообщению.

сделал. cfg.rar

HTML код: Выделить весь код
Какие именно «новые параметры»?

Они постоянно разные, предоставляются разработчиком, выглядят примерно так:
<add key="SkipPreSelect" value="false" />
<add key="RefundLockTime" value="20" />
<add key="UseSverkaDiff" value="false" />
и закрываются командой </appSettings>


HTML код: Выделить весь код
Надо полагать, конфигурационный файл — это xml-файл. Посему проще и надёжнее всего будет использовать WSH или PoSH (в случае отсутствия систем на XP и ниже).

На точках Win7 32 битка. Доменных политик на данный момент нет, будут в не скором будущем.....

Отправлено: 15:31, 12-02-2017 | #3


Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать


Перефразирую немного что бы было понятнее, каким образом можно в текстовом файле добавить между строк
<add key="UseSverkaDiff" value="false" />
</appSettings>
добавить строчки
<add key="SkipPreSelect" value="false" />
<add key="RefundLockTime" value="20" />
что бы получилось :
<add key="UseSverkaDiff" value="false" />
<add key="SkipPreSelect" value="false" />
<add key="RefundLockTime" value="20" />
</appSettings>
Естественно что бы при этом не пострадала информация сверху и снизу данного файла, и в случае если на момент применения скрипта там были уже эти строчки то они просто заменились бы.

Отправлено: 10:33, 13-02-2017 | #4


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Armsinglom,
Цитата Armsinglom:
если данные параметры есть то их трогать не нужно.
Цитата Armsinglom:
если на момент применения скрипта там были уже эти строчки то они просто заменились бы.
Чему верить?
Цитата:
Они постоянно разные, предоставляются разработчиком, выглядят примерно так:
<add key="SkipPreSelect" value="false" />
<add key="RefundLockTime" value="20" />
<add key="UseSverkaDiff" value="false" />
и закрываются командой </appSettings>
В каком виде они поставляются? В виде файла? Какая структура того, что поставляется? Или эти поставляемые строки будут Вами каким-то образом вбиты в скрипт для обновления имеющегося конфига?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:05, 13-02-2017 | #5


Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Armsinglom,
Цитата Armsinglom:
если данные параметры есть то их трогать не нужно.
Цитата Armsinglom:
если на момент применения скрипта там были уже эти строчки то они просто заменились бы.
Чему верить? »
Лучше заменять. так как информация может быть внесена ранее руками не корректно.

Цитата Armsinglom:
В каком виде они поставляются? В виде файла? Какая структура того, что поставляется? Или эти поставляемые строки будут Вами каким-то образом вбиты в скрипт для обновления имеющегося конфига? »
Всё верно, просто на почту приходит сообщение что нужно подкинуть пару новых библиотек и добавить в cfg новые параметры.
Вот и хотел бы автоматизировать наполнение файла cfg, так как обновляют третьи лица которым доверия нет, хотел как можно больше исключить человеческий фактор....

Отправлено: 18:31, 13-02-2017 | #6


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Как вариант, написал на js, так как польстился на то, что имеется 2 варианта обозначения литерала
Код: Выделить весь код
var Conf = 'Z:\\Box_In\\cfg.Config'
var ConfOut = 'Z:\\Box_In\\cfg.Config'

var Snew = new Array ( 
    '    <add key="SkipPreSelect" value="kuku" />',
    '    <add key = "RefundLockTime" value="33" />',
    '    <add key =   "iiiUseSverkaDiff" value="false" />'
);
var Send='</appSettings>';
var Skey='<add key';
var Skeyend='>';

var l=Snew.length;
var rn = String.fromCharCode(13,10);
 
var FSO,FConf,SConf;

FSO=WScript.CreateObject("Scripting.FileSystemObject");

FConf = FSO.OpenTextFile(Conf,1);
SConf = FConf.ReadAll();

FConf.Close();

while (SConf.indexOf(Skey+' ')>0) SConf = SConf.replace(Skey+' ',Skey);
while (SConf.indexOf(Skey+'= ')>0) SConf = SConf.replace(Skey+'= ',Skey+'=');

var Nend,NNend,SSnew,j,jfind,Tkey,Told;
NNend = SConf.indexOf(Send);

Nend = SConf.lastIndexOf(String.fromCharCode(13),NNend);
SSold = SConf.slice(Nend,NNend)+Send;

SSnew = SSold;
for (var i=l-1; i >=0; i--) {
	while (Snew[i].indexOf(Skey+' ')>0) Snew[i] = Snew[i].replace(Skey+' ',Skey);
	while (Snew[i].indexOf(Skey+'= ')>0) Snew[i] = Snew[i].replace(Skey+'= ',Skey+'=');
	
	Tkey = Skey + '="';
	j = Snew[i].lastIndexOf(Tkey);
	Tkey = Snew[i].slice(j,Snew[i].indexOf('"',j+Tkey.length)+1);
	
	jfind = SConf.indexOf(Tkey);
	if (jfind<0) {
		SSnew = rn+Snew[i]+SSnew;
	} else {
		Told = SConf.slice(jfind,SConf.indexOf(Skeyend,jfind)+1);		
		Tkey = Snew[i].slice(j,Snew[i].indexOf(Skeyend,j)+1);
                SConf = SConf.replace(Told,Tkey);
//		WScript.Echo(Told+rn+Tkey);
	};
}
SConf = SConf.replace(SSold,SSnew);

FConf = FSO.CreateTextFile(ConfOut,2);
FConf.Write(SConf);

FConf.Close();
Ключи задаются массивом, их надо вбить вручную. Пробелы - это сделано для тестирования, они не нужны, но не вредны. Не забудьте прописать полный путь к исходному конфиг-файлу и изменённому. Они могут совпадать

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 13-02-2017 в 21:10.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:47, 13-02-2017 | #7


Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо огромное, работает как надо!!!!
Данный скрипт можно использовать в случае изменения параметра с true на false и наоборот, что не может не радовать...
Еще раз спасибо!!!

Отправлено: 09:06, 14-02-2017 | #8


Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman не сочти за наглость, а можно этот скрипт заставить что бы он удалял все строки между
<add key="UseSverkaDiff" value="false" />
и
</appSettings>
и прописывал то что я укажу, т .е. не важно какие между этими строками были параметры и строки, он их затрёт и впишет нужные мне.

Отправлено: 15:02, 14-02-2017 | #9


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


можно этот скрипт заставить чтобы он удалял все строки между
Код: Выделить весь код
var Conf = 'Z:\\Box_In\\cfg.Config'
var ConfOut = 'Z:\\Box_In\\cfg.Config'

var Snew = new Array ( 
    '    <add key="SkipPreSelect" value="tra la la" />',
    '    <add key="RefundLockTime" value="777" />',
    '    <add key="aaaRefundLockTime" value="111777" />',
    '    <add key="bbbRefundLockTime" value="222777" />',
    '    <add key="UseSverkaDiff" value="false" />'
);
var Sdel;
Sdel = '<add key="UseSverkaDiff"';
//Sdel = '<appSettings>';

var Send='</appSettings>';
var Skey='<add key';
var Skeyend='>';

var l=Snew.length;
var rn = String.fromCharCode(13,10);
 
var FSO,FConf,SConf;

FSO=WScript.CreateObject("Scripting.FileSystemObject");

FConf = FSO.OpenTextFile(Conf,1);
	SConf = FConf.ReadAll();
FConf.Close();

while (SConf.indexOf(Skey+' ')>0) SConf = SConf.replace(Skey+' ',Skey);
while (SConf.indexOf(Skey+'= ')>0) SConf = SConf.replace(Skey+'= ',Skey+'=');

var Ndel = SConf.indexOf(Sdel);
Ndel = SConf.indexOf(String.fromCharCode(10),Ndel);

var Nend,NNend,SSnew,j,jfind,Tkey,Told;
NNend = SConf.indexOf(Send);
Nend = SConf.lastIndexOf(String.fromCharCode(13),NNend);

if (Ndel>=0) {
	SConf = SConf.replace(SConf.slice(Ndel,Nend+1),'');
	NNend = SConf.indexOf(Send);
	Nend = SConf.lastIndexOf(String.fromCharCode(13),NNend);
}

SSold = SConf.slice(Nend,NNend)+Send;

SSnew = SSold;
for (var i=l-1; i >=0; i--) {
	while (Snew[i].indexOf(Skey+' ')>0) Snew[i] = Snew[i].replace(Skey+' ',Skey);
	while (Snew[i].indexOf(Skey+'= ')>0) Snew[i] = Snew[i].replace(Skey+'= ',Skey+'=');
	
	Tkey = Skey + '="';
	j = Snew[i].lastIndexOf(Tkey);
	Tkey = Snew[i].slice(j,Snew[i].indexOf('"',j+Tkey.length)+1);
	
	jfind = SConf.indexOf(Tkey);
	if (jfind<0) {
		SSnew = rn+Snew[i]+SSnew;
	} else {
		Told = SConf.slice(jfind,SConf.indexOf(Skeyend,jfind)+1);		
		Tkey = Snew[i].slice(j,Snew[i].indexOf(Skeyend,j)+1);
                SConf = SConf.replace(Told,Tkey);
//		WScript.Echo(Told+rn+Tkey);
	};
}
SConf = SConf.replace(SSold,SSnew);

FConf = FSO.CreateTextFile(ConfOut,2);
	FConf.Write(SConf);
FConf.Close();
Можно вообще убить всё в секции appSettings, если указать
Sdel = '<appSettings>'; (сейчас это закомментировано и не работает)
и заново вбить скриптом всё что нужно. Сейчас
Sdel = '<add key="UseSverkaDiff"';
Я не стал писАть как Вы указали: <add key="UseSverkaDiff" value="false" />
посчитал это избыточным. Но если Вам надо именно так - делайте.
Сначала делается удаление, а затем вставка (замена)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:45, 14-02-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Автоматическое редактирование файла.config

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Редактирование swf файла shveicar Вебмастеру 0 05-05-2012 15:32
Доступ - Windows 7 starter. Где находится config.nt и config.sys. Что их заменяет? Надежда_Абрамова@vk Microsoft Windows 7 1 14-03-2012 23:53
ASUS P5E постоянно виснет, или нет файла WINDOWS/SYSTEM32/CONFIG/SYSTEM грузь Непонятные проблемы с Железом 8 13-09-2008 10:04
[решено] Автоматическое редактирование настроек DCOM madmax24 Microsoft Windows NT/2000/2003 2 01-07-2008 08:29
Нужно автоматическое резервное копирование папки config babki Microsoft Windows NT/2000/2003 6 30-11-2006 13:31




 
Переход