Войти

Показать полную графическую версию : Изменить настройки в *.ini файле через *.bat


Страниц : [1] 2 3

CyberMaster
29-04-2010, 21:54
Помогите пожалуйста сделать батник, изменяющий настройки в *.ini файле.
Есть файл file.ini в нем есть такие стороки:

Server_address=XXX.XXX.XXX.XXX
Server_port=XXXX

Как с помощью *.bat файла изменить значения адреса сервера и порта?
P.s текущее значения в ини файле не постоянные. То есть они могут меняться.

megaloman
29-04-2010, 22:51
А насколько принципиально решение с помощью bat-файла, а, допустим, не с помощью VBS или JS скрипта?

BSDельник
30-04-2010, 01:45
Там только эти строки?

amel27
30-04-2010, 03:16
CyberMaster, проще всего перенести эту секцию в конец файла, и добалять изменяемые строки непосредственно перед применением INI-файла:

>>file.ini ECHO Server_address=XXX.XXX.XXX.XXX
>>file.ini ECHO Server_port=XXXX

CyberMaster
30-04-2010, 08:56
А насколько принципиально решение с помощью bat-файла, а, допустим, не с помощью VBS или JS скрипта? »
Нет, нужен именно батник.
Там только эти строки? »
Нет, там есть еще и другие параметры...

amel27, спасибо, но данное решение мне не подойдет. Так как в том ини файле настройки поделены на секции такого вида:

[Main]
Server_address=XXX.XXX.XXX.XXX
Server_port=XXXX

[Proxy]
Enabled=0
Address=
И так далее...
Если я значения адрес сервера и порт опускаю в самый низ, то они не работают.

amel27
30-04-2010, 09:10
Если я значения адрес сервера и порт опускаю в самый низ, то они не работают. »
вместе со всей секцией "[Main]"?.. обычно порядок секций в INI не важен

megaloman
30-04-2010, 09:48
Запускаем батник, а в батнике VBS. Как вариант, пробовал в батнике построчно переписывать ини-файл в другой (идея была вырезать начала строк, анализировать их на равенство строк Server_address= и Server_port= и, при равенстве, цеплять туда новое значение после знака = ), но не очень надёжно получается, особенно если в ини-файле есть строки вида %ТраЛяЛя%. :closed-to

CyberMaster
30-04-2010, 10:00
amel27, в любом случае не подойдет :) Так как при каждом запуске батника, будут добавляться в конец файла новые строки.

Запускаем батник, а в батнике VBS. Как вариант, пробовал в батнике построчно переписывать ини-файл в другой (идея была вырезать начала строк, анализировать их на равенство строк Server_address= и Server_port= и, при равенстве, цеплять туда новое значение после знака = ), но не очень надёжно получается, особенно если в ини-файле есть строки вида %ТраЛяЛя%. »
Можно подробнее? Не силен я в этих скриптах :)

amel27
30-04-2010, 12:36
при каждом запуске батника, будут добавляться в конец файла новые строки »
это не причина, сделать "болванку", а батником ее копировать и добавлять в копию нужные строки

megaloman
30-04-2010, 13:30
' -----------------------------------------------------------------------------------
' Скрипт считывает указанный полным путём текстовый файл (переменная InName)
' В файле ищется первое вхождение каждой из двух подстрок (переменная Str1 и Str2)
' (эти подстроки должны быть в начале строки без лидирующих пробелов!)
' Найденная строки заменяются на строки соответственно вида Str1+EqStr1 и Str2+EqStr2
' Строки EqStr1 и EqStr2 передаются в аргументах скрипта
' Полученный результат запис на место старого файла
' -----------------------------------------------------------------------------------
' Пример использования из командной строки
' H:\Delete\ModiIn.vbs "123.456.789.012" "3456"
' -----------------------------------------------------------------------------------

InName = "H:\Delete\kuku.txt"

Str1 = "Server_address="
Str2 = "Server_port="

Set InArg=WScript.Arguments

EqStr1 = InArg(0)
EqStr2 = InArg(1)

' EqStr1 = "111.222.333.444"
' EqStr2 = "5555"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set InFile = FSO.OpenTextFile(InName, 1, False)

AllStr = InFile.ReadAll
InFile.Close

AllStr = Replace(AllStr, Chr(10), "")
Mass = Split(AllStr, Chr(13))
i1 = LBound(Mass)
i2 = UBound(Mass)

Call ModiIniSub(Mass, i1, i2, Str1, EqStr1)
Call ModiIniSub(Mass, i1, i2, Str2, EqStr2)

Set InFile = FSO.OpenTextFile(InName, 2, False)
For i = i1 To i2
If i <> i2 Then
InFile.WriteLine Mass(i)
Else
InFile.Write Mass(i)
End If
Next
InFile.Close


Sub ModiIniSub(Mass, i1, i2, Stroka, EqStroka)
LStroka = Len(Stroka)
For i = i1 To i2
If Mid(Mass(i), 1, LStroka) = Stroka Then
Mass(i) = Stroka + EqStroka
Exit For
End If
Next
End Sub

Исходник в файле (http://forum.oszone.net/attachment.php?attachmentid=43981&stc=1&d=1272619695)

El Sanchez
30-04-2010, 16:52
CyberMaster,

Вариант CMD/BAT:

@Echo Off
Setlocal ENABLEDELAYEDEXPANSION

Set "PathIniFile=C:\temp\test"
Set "IniFile=test.ini"
Set Count=1

Set /P "IP=Enter IP-address: "
Set /P "Port=Enter number of port: "

For /F "Tokens=1,2* Delims=:=" %%A In ('Findstr /IN . "%PathIniFile%\%IniFile%"') Do (
Call :Func "%%A"

If Not "%%C"=="" (
If /I "%%B"=="Server_address" (
Echo %%B=%IP%>>"%PathIniFile%\tmp"
) Else (
If /I "%%B"=="Server_port" (
Echo %%B=%Port%>>"%PathIniFile%\tmp"
) Else (
Echo %%B=%%C>>"%PathIniFile%\tmp"
)
)
) Else (
Echo %%B>>"%PathIniFile%\tmp"
)
)
Move /Y "%PathIniFile%\tmp" %IniFile% 2>nul
GoTo :EOF

:Func
Set /A Diff=%~1-!Count!
If %Diff% GTR 0 For /L %%A In (1,1,%Diff%) Do (Set /A Count+=1 & Echo.>>"%PathIniFile%"\tmp)
Set /A Count+=1

megaloman
30-04-2010, 20:27
Еще вариант батника (недостаток - съедает все пустые строки, как побороть пока не знаю)
Мне показалась привлекательной идея цикла в цикле: сначала из файла берём строку, потом выделяем из неё кусок с помощью оператора For
Echo Off
rem --------------------------------------------------
rem Преобразуем файл, определённый в переменной InFile
rem Пример использования в командной строке
rem
rem Z_My.bat 123.456.789.012 3456
rem
rem --------------------------------------------------

If '%1%2==' GoTo :End

Set InFile="H:\Delete\kuku.txt"
Set Str1=Server_address
Set Str2=Server_port

rem --------------------------------------------------
Call :Replace %1 %2 %InFile%
GoTo :End

:Replace

Set InFileBak="%~3.bak"
Move %InFile% %InFileBak%

FOR /F "usebackq delims=" %%i IN (%InFileBak%) DO (
FOR /F "usebackq delims==" %%j IN ('%%i') DO (
If Not %%j==%Str1% (
If Not %%j==%Str2% (
Echo %%i>>%3
) Else (
Echo %%j=%2>>%3
)
) Else (
Echo %%j=%1>>%3
)
)
)

:End

amel27
01-05-2010, 15:36
Вариант CMD/BAT »
коль пошла такая пьянка, до кучи еще вариант: :)


@Echo Off

CALL :REPLINE "file.ini" "Server_address=" "Server_address=192.1.1.1"
CALL :REPLINE "file.ini" "Server_port=" "Server_port=8080"

:REPLINE
If Not Exist "%~1" Exit /B 1
If Exist "%~dpn1.tmp" DEL /F/Q "%~dpn1.tmp"

Set $N=0& For /F "Delims=:" %%i In ('FindStr /BINRC:" *%~2" "%~1"') Do Set $N=%%i
If %$N% NEQ 0 For /F "Tokens=1* Delims=:" %%i In ('FindStr /ENRC:"$" "%~1"') Do If "%%i"=="%$N%" (
Echo %~3>>"%~dpn1.tmp" ) ELSE Echo.%%j>>"%~dpn1.tmp"

If Exist "%~dpn1.tmp" If Exist "%~1" DEL /F/Q "%~1"
If Exist "%~dpn1.tmp" REN "%~dpn1.tmp" "%~nx1"
Exit /B 0

El Sanchez
01-05-2010, 19:50
amel27, здОрово! Отличное решение с использованием регулярных выражений. Взял на заметку. :good:

volk1234
13-08-2011, 02:03
amel27
Интересно, что если задать
"Server_address=1"
то в ини файле будет вот так
Server_address=

А если уже 2 символа написать в сначении, то работает...

SendMessage
13-08-2011, 04:43
Интересно, что если задать
"Server_address=1"
то в ини файле будет вот так
Server_address=
А если уже 2 символа написать в сначении, то работает... »
А если значение 0 или от 2 до 9, то параметр Server_address вообще исчезает. Ну и с Server_port, конечно, то же самое. :)
Глюки обработки в cmd. Решается взятием в дополнительные скобки:
If "%%i"=="%$N%" ((Echo %~3)>>"%~dpn1.tmp")

sLiDeR-X
13-08-2011, 08:42
CyberMaster, можно через chgstr сделать довольно легко

volk1234
14-08-2011, 16:32
SendMessage
Дополнительные скобки не помогли...

SendMessage
14-08-2011, 17:17
Дополнительные скобки не помогли... »
Странно. у меня работает. Как и простой пробел перед направлением в файл.
If "%%i"=="%$N%" (Echo %~3 >>"%~dpn1.tmp")
А батник идентичен батнику amel27?

Foreigner
14-08-2011, 20:14
А если значение 0 или от 2 до 9 »
Просто %3 определяется как дескриптор перенаправления выходного потока. Пример:

@echo off

for /l %%i in (0,1,9) do call:echo %%i
goto:eof

:echo
echo %1>>test-1.txt
echo.%1>>test-2.txt

Именно по этому в файле test-1.txt только одна запись об ошибке. Запись когда передавался параметр со значением 2, т.е. STDERR.




© OSzone.net 2001-2012