Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] изменить несколько строк в файле (http://forum.oszone.net/showthread.php?t=335480)

man8531 25-06-2018 18:40 2819448

изменить несколько строк в файле
 
всем привет
не получается изменить три строки в файле конфигурации по найденному в сети батнику:
Код:

@echo off
setlocal enabledelayedexpansion
Set infile=%~dp0\other\openvpn\conf\client.ovpn
Set infileout="%ProgramFiles%\OpenVPN\config\client.ovpn"
Set findip=ipaddress
Set findcrt=user.crt
Set findkey=user.key
Set replaceip=192.168.0.1 1194
Set replacecrt=%computername%.crt
Set replacekey=%computername%.key
@echo off
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=" %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%findip%=%replaceip%!
Echo !TMPR!>>TMP.TXT
)
move /Y TMP.TXT %infileout%
exit

как заставить этот батник искать строки указанные в переменных replacekey и replacecrt и вносить это в итоговый файл?

man8531 25-06-2018 18:55 2819449

пытался переменным TMPR присвоить эти значения переменных replacekey, но не получается вывести всё это в файл - он затраивает строки.

megaloman 25-06-2018 19:13 2819451

man8531, Здесь решалась подобная задача
Но, однако, хотелось бы видеть исходный файл полностью, и, если возможно, переименуйте его в .txt и предоставьте для возможности предметного ответа. Подробнее опишите, что надо менять.

Iska 25-06-2018 19:22 2819452

Цитата:

Цитата megaloman
хотелось бы видеть исходный файл полностью, »

man8531, именно так: упакуйте Ваш файл конфигурации в архив и прикрепите последний к сообщению.

man8531 25-06-2018 19:26 2819455

Вложений: 1
файл во вложении

man8531 25-06-2018 19:31 2819458

Цитата:

Цитата megaloman
Подробнее опишите, что надо менять. »

необходимо заменить в файле конфигурации: ip адрес - с переменной findip на replaceip; имя сертификата - переменная findcrt на replacecrt; имя ключа - переменная findkey на replacekey

Iska 25-06-2018 19:54 2819463

man8531, Ваш файл конфигурации — в кодировке UTF-8 без BOM и с концами строк в формате Unix. Вас устроит PowerShell?

man8531 25-06-2018 19:57 2819464

Цитата:

Цитата Iska
Вас устроит PowerShell? »

если это будет прекрасно работать в Windows ХР и будет возможно запустить с основного батника автоустановки программ, то - да, пойдёт.

Iska 25-06-2018 20:05 2819465

Цитата:

Цитата man8531
если это будет прекрасно работать в Windows ХР »

Прекрасно — не будет. По умолчанию там вообще нет PowerShell, и максимальная версия, которую можно установить на Windows XP — 2.0.

Цитата:

Цитата man8531
если нужно, я смогу переделать файл, как Вам удобнее. »

А причём тут — переделать? Есть файл определённого формата, и работать надо с ним.

В общем, я не знаю, что Вам тут посоветовать. Разве что портированный под Windows sed использовать. Ни пакетные файлы, ни, скорее всего, WSH в данном случае (при условии сохранения оригинального формата файла) не помогут.

man8531 25-06-2018 20:13 2819466

Цитата:

Цитата Iska
В общем, я не знаю, что Вам тут посоветовать. »

хорошо, я Вас понял. значит будем некоторые моменты корректировать ручками. не всё коту масленица =)
спасибо

Iska 25-06-2018 21:00 2819472

Цитата:

Цитата man8531
хорошо, я Вас понял. »

Не поняли. Я же пишу — портированный sed. Знающие коллеги напишут Вам код.

man8531 25-06-2018 21:42 2819477

Iska,
я сторонник встроенных в систему средств. если так не получается, то пусть не будет никак. вопрос данный не настолько критичен, чтобы к нему проявлять слишком должного внимания. опенвпн у меня стоит всего на пяти машинах - ручками настрою.

Iska 25-06-2018 21:51 2819479

man8531, а что мешает положить тот же sed с библиотеками на тот же самый носитель, с которого Вы будете делать автоустановку, и пользоваться? Ровно так же, как Вы наверняка пользуете и другие сторонние средства для автоустановки? Ничего не мешает.

man8531 26-06-2018 05:11 2819499

Цитата:

Цитата Iska
Ровно так же, как Вы наверняка пользуете и другие сторонние средства для автоустановки? »

только для правки некоторых .msi, а во всём остальном: start / wait ..... ну или условие какое, если битность системы отличается от x86.

но, если есть у кого желание возиться с sed, то я непременно возьму это средство на вооружение. можете даже на повер шелл написать, так как неминуемо близится конец для машин с Windows XP.

Iska 26-06-2018 05:36 2819501

man8531, я тут подумал о паре вещей:
  1. Разве Вам нужна замена? Вы ведь целиком и полностью переписываете целевой файл, не так ли? Так что мешает, не делая никаких замен, просто его создавать?
  2. В принципе, поскольку из кириллицы у Вас в файле только комментарии, мы можем наплевать на UTF-8, открывая его как ANSI/1251 (поскольку он как раз без BOM), и концы строк — работая с файлом, не как с коллекцией строк, а как с единым целым.

man8531 26-06-2018 07:00 2819502

Iska,
1. ничто не мешает
2. можем наплевать

megaloman 26-06-2018 09:57 2819511

man8531,
Попробуйте .vbs
Код:

Set FSO = CreateObject("Scripting.FileSystemObject")

FileIn = FSO.GetParentFolderName(WScript.ScriptFullName) + "\other\openvpn\conf\client.ovpn"
FileOut = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%PROGRAMFILES%") + "\OpenVPN\config\client.ovpn"

' MsgBox FileIn + vbCrLf + FileOut

ComputerName = CreateObject("WScript.Network").ComputerName

Dim What(2), Rep(2)
What(0) = "ipaddress"
What(1) = "user.crt"
What(2) = "user.Key"

Rep(0) = "192.168.0.1 1194"
Rep(1) = ComputerName + ".crt"
Rep(2) = ComputerName + ".key"

' MsgBox What(0) + vbTab + Rep(0) + vbCrLf + What(1) + vbTab + Rep(1) + vbCrLf + What(2) + vbTab + Rep(2)

Set fIn = FSO.OpenTextFile(FileIn, 1, False)  ', -2)
Alls = fIn.ReadAll
fIn.Close

For i = 0 To UBound(What)
    Alls = Replace(Alls, What(i), Rep(i))
Next

Set fIn = FSO.CreateTextFile(FileOut, True)
fIn.Write Alls
fIn.Close

Входящий и исходящий файл может быть один и тот же

man8531 26-06-2018 11:42 2819527

megaloman,
да, всё прекрасно работает, спасибо!

man8531 26-06-2018 12:35 2819533

megaloman,
вот ведь какая незадача: переместил я скрипт в папку script и он не может найти тот конфигурационный файл, тк в качестве корневого каталога он уже задаёт каталог script. как сделать так, чтобы он в качестве корня каталога всегда выбирал каталог autoinstall? в этом каталоге и расположены все остальные. конкретный путь не подойдёт, так как хочется, чтобы каталог был перемещаем и всё в нём работало.

Iska 26-06-2018 14:02 2819542

man8531, покажите структуру каталогов. Конкретно интересует взаиморасположение каталогов script и other\openvpn\conf.

man8531 26-06-2018 14:40 2819546

Вложений: 1
так пойдёт?
корень всего - каталог autoinstall

megaloman 26-06-2018 15:55 2819552

man8531, Я ориентировался на Ваш код - скрипт расположен в той же папке, что и папка other.
Если скрипт и папка other расположены на одном диске (причём имя и вложенность папки не имеет значения), то для пути
Диск:\other\openvpn\conf\client.ovpn
замените строку
Код:

FileIn = FSO.GetDriveName(WScript.ScriptFullName) + "\other\openvpn\conf\client.ovpn"
Цитата:

Цитата man8531
корень всего - каталог autoinstall »

Или, если я правильно понял, так
Код:

FileIn = FSO.GetDriveName(WScript.ScriptFullName) + "\autoinstall\other\openvpn\conf\client.ovpn"

man8531 26-06-2018 16:39 2819557

megaloman,
не помогает, говорит, что не найден путь до переменной FileIn
наверное, я делаю что-то не так или некорректно объясняю: мой каталог установки (autoinstall), будет располагаться где угодно - рабочий стол, папка загрузок и тд. в батниках я использую переменную %~dp0 для обозначения исходной папки, откуда всё запускается. у меня один большой батник, который производит установку программ и конфигурирует некоторые конфиги с помошью доп батников или скриптов, вроде Вашего. так вот, сейчас я поместил в главный батник, что лежит в корне каталога autoinstall, строку:
Код:

%~dp0script\openvpn_Ethernet.vbs
он, с админскими правами, запускает Ваш скрипт, что лежит в каталоге \autoinstall\script\openvpn_Ethernet.vbs
сам каталог autoinstall сейчас находится на рабочем столе.

наверное, в этом случае придётся ложить конфиги в папку script. потому, как я понял, головным каталогом скрипт распознаёт script

в этом виде он отрабатывает всё без проблем, если конфиг опенвпн поместить в каталог script
Скрытый текст
Код:

Set FSO = CreateObject("Scripting.FileSystemObject")

FileIn = FSO.GetParentFolderName(WScript.ScriptFullName) + "\openvpn\conf\client.ovpn"
FileOut = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%PROGRAMFILES%") + "\OpenVPN\config\client.ovpn"

' MsgBox FileIn + vbCrLf + FileOut

ComputerName = CreateObject("WScript.Network").ComputerName

Dim What(2), Rep(2)
What(0) = "ipaddress"
What(1) = "user.crt"
What(2) = "user.key"

Rep(0) = "192.168.0.1 1194"
Rep(1) = ComputerName + ".crt"
Rep(2) = ComputerName + ".key"

' MsgBox What(0) + vbTab + Rep(0) + vbCrLf + What(1) + vbTab + Rep(1) + vbCrLf + What(2) + vbTab + Rep(2)

Set fIn = FSO.OpenTextFile(FileIn, 1, False)  ', -2)
Alls = fIn.ReadAll
fIn.Close

For i = 0 To UBound(What)
    Alls = Replace(Alls, What(i), Rep(i))
Next

Set fIn = FSO.CreateTextFile(FileOut, True)
fIn.Write Alls
fIn.Close


megaloman 26-06-2018 17:47 2819566

Цитата:

Цитата man8531
мой каталог установки (autoinstall), »

Я не понимаю, как соотносится каталог autoinstall с каталогом other и каталогом Script. Из той картинки ничего не понятно. Там autoinstall нет вообще.

Кстати, а наверное необходимо писАть путь в кавычках, в любом случае они не мешают.
"%~dp0script\openvpn_Ethernet.vbs"

man8531 26-06-2018 18:48 2819574

Вложений: 1
Цитата:

Цитата megaloman
Из той картинки ничего не понятно. Там autoinstall нет вообще. »

моя оплошность. прикладываю более полную картинку. но я писал, что: корень всего - каталог autoinstall. а сам он может располагаться где угодно.
Цитата:

Цитата megaloman
Кстати, а наверное необходимо писАть путь в кавычках, в любом случае они не мешают. »

по правилам хорошего тона - да. но эти кавычки добавляют лишний слэш иногда, вот и не ставлю их периодически. там и пробелов в пути нет.

megaloman 26-06-2018 18:56 2819576

man8531, Я слегка запутался, иду по пути наименьшего сопротивления:
Батник:
Код:

@Echo Off

Set "infile=%~dp0other\openvpn\conf\client.ovpn"
Set "infileout=%ProgramFiles%\OpenVPN\config\client.ovpn"

"%~dp0script\openvpn_Ethernet.vbs" "%infile%" "%infileout%"

.vbs
Код:

With WScript.Arguments
    If .Count < 2 Then WScript.Quit 1
        FileIn = .Item(0)
        FileOut = .Item(1)
End With

' MsgBox FileIn + vbCrLf + FileOut

ComputerName = CreateObject("WScript.Network").ComputerName

Dim What(2), Rep(2)
What(0) = "ipaddress"
What(1) = "user.crt"
What(2) = "user.Key"

Rep(0) = "192.168.0.1 1194"
Rep(1) = ComputerName + ".crt"
Rep(2) = ComputerName + ".key"

Set FSO = CreateObject("Scripting.FileSystemObject")

Set fIn = FSO.OpenTextFile(FileIn, 1, False)  ', -2)
Alls = fIn.ReadAll
fIn.Close

For i = 0 To UBound(What)
    Alls = Replace(Alls, What(i), Rep(i))
Next

Set fIn = FSO.CreateTextFile(FileOut, True)
fIn.Write Alls
fIn.Close

WScript.Quit 0

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

man8531 26-06-2018 19:36 2819584

megaloman,
если всё сложно, то и не стоит оно того. я, думал, что пару символов добавил и всё, а тут симбиоз уже намечается какой-то.

upd
в общем решил вопрос двумя шаблонами, которые будут копироваться в каталог программы, в зависимости от потребности. а остальные два параметра руками потом поправлю.

upd
а лучше, чтобы труды не пропали, размещу конфиги в папке со скриптами, там они будут их отрабатывать.

upd
положил - всё отлично отрабатывают! спасибо!

Iska 26-06-2018 22:54 2819604

megaloman, можно просто использовать относительный путь — из script вверх, в родительский каталог, а затем вниз к other и т.д.:
Код:

FileIn = FSO.GetParentFolderName(WScript.ScriptFullName) + "\..\other\openvpn\conf\client.ovpn"
Я не проверял, но должно работать.

megaloman 26-06-2018 23:50 2819615

man8531,
Вот батник, совмещенный с js. Всё в одном файле. Батник должен быть в рядом с папкой other. У меня всё это хозяйство в папке autoinstall, которая на рабочем столе. Работает.
Всё ваше дополнительное батниковаяние, если надо, должно происходить между имеющимися
/* */
Код:

@set @E=1; /*

@Echo Off

Set "infile=%~dp0other\openvpn\conf\client.ovpn"
Set "infileout=%ProgramFiles%\OpenVPN\config\client.ovpn"

cscript //NoLogo /E:jscript "%~dpnx0" "%infile%" "%infileout%"
GoTo :Eof

*/
var oArg = WScript.Arguments;
var FSO = WScript.CreateObject("Scripting.FileSystemObject");

var FileIn = oArg(0);
var FileOut = oArg(1);
var ComputerName = WScript.CreateObject("WScript.Network").ComputerName;

var What = new Array(2);
var Rep = new Array(2);

What[0] = "ipaddress";
What[1] = "user.crt";
What[2] = "user.key";

Rep[0] = "192.168.0.1 1194";
Rep[1] = ComputerName + ".crt";
Rep[2] = ComputerName + ".key";

var fIn = FSO.OpenTextFile(FileIn, 1, false);
var Alls = fIn.ReadAll();
fIn.Close();

for (i=0; i<What.length; i++) {Alls = Alls.replace(What[i],Rep[i]);}

fIn = FSO.CreateTextFile(FileOut, true);
fIn.Write(Alls);
fIn.Close();

WScript.Quit(0);

Iska, Спасибо, непременно попробую разобраться.

man8531 27-06-2018 06:27 2819637

Цитата:

Цитата Iska
FileIn = FSO.GetParentFolderName(WScript.ScriptFullName) + "\..\other\openvpn\conf\client.ovpn" »

это ключ к решению проблемы с каталогом script - всё заработало как и задумано. спасибо всем большое!


Время: 07:58.

Время: 07:58.
© OSzone.net 2001-