morgan-12l1
12-09-2019, 09:19
Добрый день.
Помогите пожалуйста как сделать замену всех путей баз в файлах ibases.v8i.
Есть сервер, где у кого-то прописаны в файле базы, и эти базы переехали, а поправить нужно у всех, у кого в файле ibases.v8 прописаны старые базы. на новые. При этом новые базы и название старых нужно взять из excel файла.
Я предполагаю действовать следует так
1. Последовательно прочитать все файлы "C:\users\*\appdata...\ibases.v8i"
2. Прочитать базы подлежащие замене из cvs файла, в котором есть поля: "СтарыйСервер","СтароеНазваниеБазы","НовыйСервер","НовоеНазваниеБазы"
2a - учесть ситуацию, когда неизвестно какой указан сервер. То есть может быть что угодно между:
Connect=Srvr="Тутнепонятночто";Ref="base1";
3. Скопировать файлы перед изменением с сохранением структуры у кого производилось изменение (например пользователь user1) - значит в папке backup создать папку с именем User1 и уже туда скопировать.
3. Произвести замену по маске пути на новую базу.
4. Сохранить изменение в исходный файл ibases.v8i
Моё решение промежуточное:
1. Создан файл excel, с последующим сохранением в cvs с указанными значениями выше.
Мой код:
$replacers = Import-Csv "C:\ps\test1.csv" -Encoding Default -Delimiter ";"
gc C:\ps\ibases.v8i | ForEach-Object {
$output = $_
foreach ($r in $replacers) {
$outSrvr='Connect=Srvr="'+$r.Srvr+'";'
$outRef='Ref="'+$r.Ref+'";'
$outReplace=$outSrvr+$outRef
$output = $output -replace ("^Connect=Srvr=.+[$r.Ref$]??"),($outReplace)
}
return $output | Out-File C:\ps\ibases11.v8i -Append -Encoding utf8
}
Содержимое файла ibases.v8i Для примера:
[База1]
Connect=Srvr="server1";Ref="Base1";
ID=7853661-7598-49778-3gg6-1414451
OrderInList=7859
Folder=/
OrderInTree=458
External=0
App=Auto
WA=1
[База2]
Connect=Srvr="server2";Ref="Base2";
ID=7853661-7598-49778-3gg6-1414551
OrderInList=45889
Folder=/
OrderInTree=78
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
DefaultVersion=8.3.12.1616
[abk _ 2017]
Connect=Srvr="Server3";Ref="Base3";
ID=7853661-7598-49778-3gg6-14148551
OrderInList=4586
Folder=/
OrderInTree=1458
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
Я запутался как сделать регулярное выражение для замены и если выполнять выше код, замена происходит, но например в файле cvs будет последняя база base3, то ВСЕ базы будут замены почему то на base3 и server3
Помогите пожалуйста как сделать замену всех путей баз в файлах ibases.v8i.
Есть сервер, где у кого-то прописаны в файле базы, и эти базы переехали, а поправить нужно у всех, у кого в файле ibases.v8 прописаны старые базы. на новые. При этом новые базы и название старых нужно взять из excel файла.
Я предполагаю действовать следует так
1. Последовательно прочитать все файлы "C:\users\*\appdata...\ibases.v8i"
2. Прочитать базы подлежащие замене из cvs файла, в котором есть поля: "СтарыйСервер","СтароеНазваниеБазы","НовыйСервер","НовоеНазваниеБазы"
2a - учесть ситуацию, когда неизвестно какой указан сервер. То есть может быть что угодно между:
Connect=Srvr="Тутнепонятночто";Ref="base1";
3. Скопировать файлы перед изменением с сохранением структуры у кого производилось изменение (например пользователь user1) - значит в папке backup создать папку с именем User1 и уже туда скопировать.
3. Произвести замену по маске пути на новую базу.
4. Сохранить изменение в исходный файл ibases.v8i
Моё решение промежуточное:
1. Создан файл excel, с последующим сохранением в cvs с указанными значениями выше.
Мой код:
$replacers = Import-Csv "C:\ps\test1.csv" -Encoding Default -Delimiter ";"
gc C:\ps\ibases.v8i | ForEach-Object {
$output = $_
foreach ($r in $replacers) {
$outSrvr='Connect=Srvr="'+$r.Srvr+'";'
$outRef='Ref="'+$r.Ref+'";'
$outReplace=$outSrvr+$outRef
$output = $output -replace ("^Connect=Srvr=.+[$r.Ref$]??"),($outReplace)
}
return $output | Out-File C:\ps\ibases11.v8i -Append -Encoding utf8
}
Содержимое файла ibases.v8i Для примера:
[База1]
Connect=Srvr="server1";Ref="Base1";
ID=7853661-7598-49778-3gg6-1414451
OrderInList=7859
Folder=/
OrderInTree=458
External=0
App=Auto
WA=1
[База2]
Connect=Srvr="server2";Ref="Base2";
ID=7853661-7598-49778-3gg6-1414551
OrderInList=45889
Folder=/
OrderInTree=78
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
DefaultVersion=8.3.12.1616
[abk _ 2017]
Connect=Srvr="Server3";Ref="Base3";
ID=7853661-7598-49778-3gg6-14148551
OrderInList=4586
Folder=/
OrderInTree=1458
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
Я запутался как сделать регулярное выражение для замены и если выполнять выше код, замена происходит, но например в файле cvs будет последняя база base3, то ВСЕ базы будут замены почему то на base3 и server3