Что нового

Массив из мультистрокового параметра реестра

musicstashall

Знающий
Сообщения
322
Репутация
7
Версия AutoIt: 3.3

Описание:
Имею мультистроковый параметр REG_MULTY_SZ со значениями:
Val1
Val2
Val3
Необходимо получить список и представить его в переменной в таком виде: «"Vai1" or "Val2" or "Val3" ...» и тд.
Примечания:
И обратная задача. Требуется добавить/удалить значение в/из мультистроковый параметр. Почему-то у меня не получилось это сделать.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
В чём возникла сложность ? из справки к функции
Код:
RegRead ( "keyname", "valuename" )

При чтении параметров типа REG_MULTI_SZ многострочные данные разделяются символом @LF - используйте функцию StringSplit(..., @LF), чтобы получить массив, содержащий отдельные строки.
И ко второй части вопроса к функции
Код:
RegWrite ( "keyname" [, "valuename" , "type" , value ] )

При создании параметра типа REG_MULTI_SZ необходимо разделять многострочные данные символом @LF. Значение НЕ должно заканчиваться символом @LF, если вы не хотите получить пустую строку в конце значения (см. пример).
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
используйте функцию StringSplit(..., @LF), чтобы получить массив, содержащий отдельные строки.
Не получается. Делаю таким образом. В первом сообщении получаю список значений, а во стором сообщении пусто.

Код:
$Key = RegRead("HKEY_CURRENT_USER\...", "Key")
MsgBox("","", $Key)
$Val = StringSplit($Key, @LF)
MsgBox("","", $Val)



Сделайте свой пример.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
MsgBox не может выводить массив.


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

Функции которые вы видите в блоке Autoit сделаны кликабельными. Ссылки ведут на русскую справку.
Код:
stringsplit

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

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
musicstashall [?]
Как из массива получить строку всех значений через определенный разделитель «" or "»?
Код:
Local $sValue = RegRead ('HKEY_CURRENT_USER\SOFTWARE\!test', 'aaa')

Local $sOut = '«"' & StringReplace($sValue, @LF, '" or "') &  '"»'
MsgBox(0,'',$sOut)
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Получилось! Имею искомую строку. Отсюда сразу же вопрос — в моем случае or не может являться оператором?? Мне нужно сделать перечисление после знака равенства:
Код:
If $sOut = "Val1" or "Val2" or "Val3" Then

думал представить всё в одной переменной, но не прокатило.


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

Реализовал таким образом, через перебор. Всё устраивает. Благодарствую.
Код:
$keyname = "HKCU\..."
$sValue = RegRead($keyname, "val")
$aArray = StringSplit($sValue, @LF)
	            For $i = 1 To $aArray[0]
                    if $aArray[$i] == $win Then
	                    MsgBox()
	                    ExitLoop
                    EndIf
                Next
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
If StringInStr(RegRead($keyname, "val"), $win) Then MsgBox(0, '', '')
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
С записью в реестр не получается. Делаю:
Код:
RegWrite($keyname [, $uValue, $type, "OK"] )

Ошибка, ругается на квадратные скобки:
Код:
RegWrite($keyname [, $uValue, $type, "OK"] )
RegWrite($keyname ^ ERROR

Если делаю так, то просто не записывает:
Код:
RegWrite($keyname, $uValue, $type, "OK")

Пробовал и с правами администратора.
А в мультистроковый параметр именно так добавляется строка?? Или таким образом все строки должны переписаться на новые? Мне нужно добавлять строки и удалять строки, оставляя другие строки без изменения.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
musicstashall [?]
А в мультистроковый параметр именно так добавляется строка??
Прочитайте ответ номер 1.
Строку нужно формировать с разделителем @LF
И да, все строки будут переписаны.

Мне нужно добавлять строки и удалять строки, оставляя другие строки без изменения.
Функция не может удалять и добавлять, она только может записать то, что вы ей указали. Как вы сформируете строку, так она и запишется. Как делать - это отдельная тема.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
inververs сказал(а):
Строку нужно формировать с разделителем @LF
Пробовал и с разделителями. Вот, записываю целиком массив, полученный из одного параметра, в другой. Не записывает.
Код:
Global $keyname = "HKCU\..."
Global $sValue = RegRead($keyname, "123")
Global $type = 'REG_MULTY_SZ'
RegWrite($keyname, "OK", $type, $sValue)

Сори, если я где-то туплю)
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Разобрался с причиной, оказывается тип параметра не читается из переменной. Если тип прописывать непосредственно 'REG_MULTY_SZ', то команда успешно записывает данные. Как бы с этим можно согласиться, но опять редактор AutoIt ругается:
Код:
Func Write()
	RegWrite($keyname, "OK", 'REG_MULTY_SZ', $sValue)
EndFunc   ;==>Write

error: Func Write() called with illegal argument 3: "REG_MULTY_SZ"
Если компилирую в ISN Studio, то всё ок.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
тип параметра не читается из переменной
только что у себя проверил, всё срабатывает
Код:
Global $keyname = "HKEY_CURRENT_USER\Software\Test"
Global $sValue = "123"
Global $type = 'REG_MULTI_SZ'
RegWrite($keyname, "OK", $type, $sValue)
ConsoleWrite('error '&@error&@CR)
Разницу видите в названии параметра "REG_MULTI_SZ", а что у Вас ? - "REG_MULTY_SZ" !!!
 
Верх