Что нового

Как в ini файле внести в раздел три одинаковых параметра с разными значениями

evgen_vasgen

Новичок
Сообщения
19
Репутация
0
Помогите записать значения в ini файл. Необходимо в одном разделе (BSA) создать три параметра с одинаковым названием но разными значениями, которые являются переменными.
В конфиге это должно выглядеть так:
Код:
[BSA]
InjectDll=С:\Sandboxie\app\sandboxie\sbiextra.dll
InjectDll=С:\Sandboxie\app\sandboxie\antidel.dll
InjectDll=С:\Sandboxie\app\sandboxie\lapi.dll
IniWrite я так понимаю здесь не поможет. Он просто запишет последнее значение.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Код:
IniWriteSection ( "filename", "section", "data")
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
evgen_vasgen [?]
Необходимо в одном разделе (BSA) создать три параметра с одинаковым названием но разными значениями
Для чего?
Не проще ли записать в один параметр все три значения через разделитель? :scratch:
 
Автор
E

evgen_vasgen

Новичок
Сообщения
19
Репутация
0
CreatoR
Конечно проще, только как?? Я еще тока с языком осваиваюсь, такого сродить наверное не смогу..
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
При записи используй разделитель
При чтении используй либо регулярные выражения для разделения, либо StringSplit
 
Автор
E

evgen_vasgen

Новичок
Сообщения
19
Репутация
0
DarWiM
Спасибо, только мне это ни о чем не говорит. Чтож, буду искать какие-нить примеры
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
evgen_vasgen
1. FileWrite
2. Какая программа читает файл? Сторонняя? Если нет, то формат утопичный, InjectDll у всех, а значит по умолчанию, и значит без него будет как с ним, а значит лишний мусор бесполезен.
 
Автор
E

evgen_vasgen

Новичок
Сообщения
19
Репутация
0
AZJIO
Программа называется Sandboxie, она как раз и читает. На руборде, в варезнике есть портативный вариант от Gif, так там с тремя одинаковыми параметрами InjectDll все нормально работает.
Искал примеры с функцией FileWrite, но ничего подходящего не нашел.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
это уже не ini. у ini-формата есть негласные правила, один из которых иметь разные названия ключей в пределах одной секции. Ini-функции AutoIt-а следуют этому правилу. поэтому тут только свою читалку-писалку писать.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
evgen_vasgen

А по-простому, через замену строки текстового файла не получится?

Код:
#include <File.au3>
$sPath_ini=@ScriptDir & '\1.ini'

IniWrite($sPath_ini, 'BSA', 'InjectDll', 'С:\Sandboxie\app\sandboxie\sbiextra.dll')

$szSearchString='InjectDll=С:\Sandboxie\app\sandboxie\sbiextra.dll'

$szReplaceString1=$szSearchString
$szReplaceString2='InjectDll=С:\Sandboxie\app\sandboxie\antidel.dll'
$szReplaceString3='InjectDll=С:\Sandboxie\app\sandboxie\lapi.dll'

_ReplaceStringInFile($sPath_ini, $szSearchString, $szReplaceString1 & @CRLF & $szReplaceString2 & @CRLF & $szReplaceString3)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Можно вот так извратиться:

Код:
_IniWriteKeyValues(@DesktopDir & '\File.ini', 'BSA', 'InjectDll', 'С:\Sandboxie\app\sandboxie\sbiextra.dll|С:\Sandboxie\app\sandboxie\antidel.dll|С:\Sandboxie\app\sandboxie\lapi.dll')

Func _IniWriteKeyValues($sFile, $sSect, $sKey, $sVals)
	$aSplit_Vals = StringSplit($sVals, '|')
	
	Local $sLast_Val = $aSplit_Vals[$aSplit_Vals[0]]
	Local $sKeys = ''
	
	For $i = 1 To $aSplit_Vals[0] - 1
		$sKeys &= $sKey & '=' & $aSplit_Vals[$i] & @CRLF
	Next
	
	IniWrite($sFile, $sSect, $sKeys & $sKey, $sLast_Val)
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Еще один изврат:
Код:
#include<Array.au3>
#include <File.au3>
$sIni=@ScriptDir & "\1.ini" 
IniWrite($sIni, 'BSA', 'InjectDll', 'aaa')
IniWrite($sIni, 'BSA', 'InjectDll' & Chr(152), 'bbb')
IniWrite($sIni, 'BSA', 'InjectDll' & Chr(152)& Chr(152), 'ccc')
_ReplaceStringInFile($sIni, Chr(152), ''); возможно понадобится
$aData=IniReadSection($sIni, "BSA")
_ArrayDisplay($aData, "$aData")
 
Автор
E

evgen_vasgen

Новичок
Сообщения
19
Репутация
0
Взял для пробы первый вариант, поскольку он для меня хоть немного понятен. Все работает здорово!
Код:
$Config = @ScriptDir & "\ini\sandboxie.ini"
IniWrite($Config, 'BSA', 'InjectDll', @ScriptDir & '\app\sandboxie\BSA\sbiextra.dll')
$szSearchString='InjectDll='&@ScriptDir & '\app\sandboxie\BSA\sbiextra.dll'
$szReplaceString1=$szSearchString
$szReplaceString2='InjectDll='&@ScriptDir & '\app\sandboxie\BSA\antidel.dll'
$szReplaceString3='InjectDll='&@ScriptDir & '\app\sandboxie\BSA\lapi.dll'
_ReplaceStringInFile($Config, $szSearchString, $szReplaceString1 & @CRLF & $szReplaceString2 & @CRLF & $szReplaceString3)


Раз уж пошла такая пьянка будем резать и пилить скрипт дальше если в помощи не откажете. Можно организовать проверку наличия каждого из этих трех файлов и записать только те, кто будут в наличии.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
evgen_vasgen [?]
Можно организовать проверку наличия каждого из этих трех файлов и записать только те, кто будут в наличии.

Попробуй так :
Код:
#include <File.au3>
$Config = @ScriptDir & "\ini\sandboxie.ini"

Dim $aFile[5]=[4, '\app\sandboxie\BSA\sbiextra.dll', '\app\sandboxie\BSA\sbiextra.dll',  '\app\sandboxie\BSA\antidel.dll', '\app\sandboxie\BSA\lapi.dll']
$szSearchString=''
$szReplaceString=''

For $i=1 To  $aFile[0]-1
	If  FileExists (@ScriptDir & '\' & $aFile[$i])  Then
		If $szSearchString='' Then
			$szSearchString="InjectDll=" & @ScriptDir & '\' & $aFile[$i] 
			IniWrite($Config, 'BSA', 'InjectDll', @ScriptDir & '\' & $aFile[$i])
		EndIf
	Else
		ContinueLoop
	EndIf
	
	If FileExists (@ScriptDir & '\' & $aFile[$i]) Then
		$szReplaceString &="InjectDll=" & @ScriptDir & '\' & $aFile[$i+1] & @CRLF
	EndIf
	
Next

If $szSearchString And $szReplaceString Then
	_ReplaceStringInFile($Config, $szSearchString, $szReplaceString)
EndIf




Добавлено:
Сообщение автоматически объединено:

И все же мой предыдущий вариант проще в реализации :
Код:
#include <File.au3>
$Config = @ScriptDir & "\ini\sandboxie.ini"

Dim $aFile[5]=[4, '\app\sandboxie\BSA\sbiextra.dll', '\app\sandboxie\BSA\sbiextra.dll',  '\app\sandboxie\BSA\antidel.dll', '\app\sandboxie\BSA\lapi.dll']
;$sKey= 'InjectDll'
$sKey= 'InjectDll' & Chr(152)
For $i=1 To  $aFile[0]-1
	If  FileExists (@ScriptDir & '\' & $aFile[$i])  Then
		IniWrite($Config, 'BSA', $sKey , @ScriptDir & '\' & $aFile[$i])
		$sKey &=Chr(152)
	EndIf
Next

;_ReplaceStringInFile($sIni, Chr(152), '')
_ReplaceStringInFile($Config, Chr(152), '')
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Вот чем вам всем вариант с записью через IniWriteSection() не нравится?

Из справки (почти):
Код:
$sIni = @DesktopDir & "\AutoIt-Test.ini"

; Демонстрация создания новой секции, используя строку с параметрами и значениями.
$sData = "InjectDll=С:\Sandboxie\app\sandboxie\sbiextra.dll" & @LF & _
		 "InjectDll=С:\Sandboxie\app\sandboxie\antidel.dll" & @LF & _
		 "InjectDll=С:\Sandboxie\app\sandboxie\lapi.dll"
IniWriteSection($sIni, "BSA", $sData)
 
Автор
E

evgen_vasgen

Новичок
Сообщения
19
Репутация
0
gregaz
Странно, но Ваши оба варианта в сообщении №13 затирают ВСЁ в инишке. По крайней мере Sandboxie у меня создала дефолтный файл настроек. Может это я чего напутал? Второй вариант кста содержит ошибку, нужно писать не $sIni а $Config.

DarWiM
Ваш вариант очень красив, однако у меня туда не получается втиснуть свои переменные, расположение файлов то может у разных пользователей меняться.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
evgen_vasgen
а в чём собственно проблема?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
DarWiM
а в чём собственно проблема?
Человеку нужен парсер, вставка/чтение, ini тут ни причём, это просто расширение текущего файла, оно могло бы быть pdf, суть от этого не поменяется.
Код:
#include <Array.au3>
$sText = FileRead(@ScriptDir&'\BSA.ini')
$sText = StringRegExpReplace($sText, "(?s)\A.*\[BSA\]\r?\n(.*?)(?=\s+\[.*\z|\s*\z)", "\1")
$aText = StringSplit($sText, @CRLF, 1)
For $i = 1 To $aText[0]
	$aText[$i] = StringRegExpReplace($aText[$i], '^.+?=(.+)', '\1')
Next
_ArrayDisplay($aText, 'Yes?')
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
evgen_vasgen [?]
Странно, но Ваши оба варианта в сообщении №13 затирают ВСЁ в инишке.

Естественно. Все предыдущие записи с InjectDll будут заменены.
Чтобы этого не происходило нада заменить первое объявление
Код:
$sKey= 'InjectDll'

на
Код:
$sKey= 'InjectDll'   & Chr(152)
 
Верх