Автор Тема: Массив из мультистрокового параметра реестра  (Прочитано 1192 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

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

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Версия AutoIt: 3.3

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

Русское сообщество AutoIt

Массив из мультистрокового параметра реестра
« Отправлен: Апрель 18, 2017, 10:03:58 »

Оффлайн ra4o [?]

  • Скриптер
  • ****
  • Сообщений: 693
  • Репутация: 119
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
В чём возникла сложность ? из справки к функции
Код: AutoIt [Выделить]
RegRead ( "keyname", "valuename" )

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

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

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
используйте функцию StringSplit(..., @LF), чтобы получить массив, содержащий отдельные строки.
Не получается. Делаю таким образом. В первом сообщении получаю список значений, а во стором сообщении пусто.

Код: AutoIt [Выделить]
$Key = RegRead("HKEY_CURRENT_USER\...", "Key")
MsgBox("","", $Key)
$Val = StringSplit($Key, @LF)
MsgBox("","", $Val)



Сделайте свой пример.
« Последнее редактирование: Апрель 18, 2017, 12:24:36 от musicstashall »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
MsgBox не может выводить массив.


Добавлено: Апрель 18, 2017, 12:44:40
Функции которые вы видите в блоке Autoit сделаны кликабельными. Ссылки ведут на русскую справку.
Код: AutoIt [Выделить]
У каждой функции в справке, в самом низу есть примеры использования.
Надеюсь, это поможет вам разобраться.

Русское сообщество AutoIt

Re: Массив из мультистрокового параметра реестра
« Ответ #3 Отправлен: Апрель 18, 2017, 12:40:00 »

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
MsgBox не может выводить массив.
Как из массива получить строку всех значений через определенный разделитель «" or "»?

Помечен как лучший ответ пользователем musicstashall Отправлен Апрель 18, 2017, 13:12:41

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
musicstashall  [?]
Цитировать
Как из массива получить строку всех значений через определенный разделитель «" or "»?
Код: AutoIt [Выделить]
Local $sValue = RegRead ('HKEY_CURRENT_USER\SOFTWARE\!test', 'aaa')

Local $sOut = '«"' & StringReplace($sValue, @LF, '" or "') &  '"»'
MsgBox(0,'',$sOut)


Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Получилось! Имею искомую строку. Отсюда сразу же вопрос — в моем случае or не может являться оператором?? Мне нужно сделать перечисление после знака равенства:
Код: AutoIt [Выделить]
If $sOut = "Val1" or "Val2" or "Val3" Then

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


Добавлено: Апрель 18, 2017, 14:45:40
Реализовал таким образом, через перебор. Всё устраивает. Благодарствую.
Код: AutoIt [Выделить]
$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
 


« Последнее редактирование: Апрель 18, 2017, 14:48:34 от musicstashall »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3654
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
If StringInStr(RegRead($keyname, "val"), $win) Then MsgBox(0, '', '')


Русское сообщество AutoIt

Re: Массив из мультистрокового параметра реестра
« Ответ #7 Отправлен: Апрель 18, 2017, 15:24:59 »

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
С записью в реестр не получается. Делаю:
Код: AutoIt [Выделить]
RegWrite($keyname [, $uValue, $type, "OK"] )

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

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

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

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
musicstashall  [?]
Цитировать
А в мультистроковый параметр именно так добавляется строка??
Прочитайте ответ номер 1.
Строку нужно формировать с разделителем @LF
И да, все строки будут переписаны.

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

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

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

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

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Разобрался с причиной, оказывается тип параметра не читается из переменной. Если тип прописывать непосредственно 'REG_MULTY_SZ', то команда успешно записывает данные. Как бы с этим можно согласиться, но опять редактор AutoIt ругается:
Код: 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 [?]

  • Скриптер
  • ****
  • Сообщений: 693
  • Репутация: 119
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
тип параметра не читается из переменной
только что у себя проверил, всё срабатывает
(нажмите для показа/скрытия)
Разницу видите в названии параметра "REG_MULTI_SZ", а что у Вас  ? - "REG_MULTY_SZ" !!!
« Последнее редактирование: Апрель 21, 2017, 15:31:06 от ra4o »

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Вот жеж, олень)) Благодарю от души.

Русское сообщество AutoIt

Re: Массив из мультистрокового параметра реестра
« Ответ #13 Отправлен: Апрель 21, 2017, 15:35:54 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
2043 Просмотров
Последний ответ Декабрь 22, 2013, 09:13:42
от madmasles
6 Ответов
1290 Просмотров
Последний ответ Сентябрь 22, 2014, 19:43:04
от Garrett
9 Ответов
2158 Просмотров
Последний ответ Октябрь 21, 2014, 14:37:45
от madmasles
0 Ответов
690 Просмотров
Последний ответ Октябрь 20, 2014, 13:26:08
от madmasles
3 Ответов
1514 Просмотров
Последний ответ Ноябрь 28, 2014, 07:20:47
от shyra1976
3 Ответов
916 Просмотров
Последний ответ Март 13, 2015, 16:44:28
от Yashied
16 Ответов
2900 Просмотров
Последний ответ Август 09, 2015, 23:56:30
от uritalex
8 Ответов
1880 Просмотров
Последний ответ Октябрь 10, 2015, 16:57:18
от Garrett
3 Ответов
1095 Просмотров
Последний ответ Февраль 18, 2016, 17:48:14
от Garrett
4 Ответов
1214 Просмотров
Последний ответ Август 18, 2016, 11:52:44
от InnI