|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Регфайл, синтаксис. |
|
|
Регфайл, синтаксис.
|
|
Ветеран Сообщения: 842 |
Думаю пора обсудить написание валидных регфайлов средствами AutoIt3.
Хочется объединить всё вместе, как некое знание и рассмотреть все встречающиеся особенности записи различных типов параметров. Сразу же хочеться отметить различие реестров x86 и x64, и в то же время рег синтакс исключающий записи вида HKLM/HKCU и т.п. Здесь могут быть полезными выключатели Switch @OSArch
Case 'x86'
$sRegKey = 'HKLM\Software\RegKey'
Case 'x64'
$sRegKey = 'HKLM\Software\Wow6432Node\RegKey'
EndSwitch
$sFileContent = _
'Windows Registry Editor Version 5.00' & @CRLF & @CRLF & _
'[' & $sRegKey & ']' & @CRLF & _
'"ValueName"=' & $sSerialResult & & @CRLF & @CRLF
Однако, большую сложность думаю представляет запись значений параметров в валидном виде для регфалов! Например, все типы кроме REG_SZ и REG_DWORD имеют запись вида = hex(2): Причём, понятно что REG_EXPAND_SZ содержит юникод, экспортирующийся в виде шеснадцетиричного кода разделённого запятыми в регфайл. Закрывается строка нуевым символом, то-есть двумя байтами нулей ',00,00' (впрочем это так же актуально и для multisz и для binary) Несмотря на то, что строки могут быть размещены без переносов, и это работает, однако майкрософт придумала способ записи разделяемой слеш, для переноса строки. Это красиво и хотелось бы тоже этому следовать. Длина строк в такой записи содержит 25 байт разделённых запятыми, строки начинается с двух пробелов и заканчивается слеш, если нужен перенос Однако первая строка имеет не постоянную длину относительно имени переменной. Минимальная строка содержит 22 байта разделённых запятыми, и начинает убавляться на один байт при увеличении длины имени переменной на 4 символа. "1"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\ "12"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\ "123"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\ "1234"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,\ < строка стала короче "zzz"=dword:0001e240 И другие (zero-lenth-binary-value) "value1"=hex(0): У меня просьба, сделайте свои предложения по поводу кода autoit, и быть может это соберёться в некий включаемый файлик? Вопрос: можно ли получить юникод или бинарную не ascii строку в перменную и затем разделить все байты строки запятыми? Ну и особое желание - это установить слеши по схеме регфайла, тоесть с расчётом длинны, длин и т.п. ![]() Ещё проще вопрос, как записать запятую через каждые два символа, заранее неизвестной строки... aa,bb,ab,ac,.... |
|
|
------- Отправлено: 20:17, 22-06-2009 |
|
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Получается следующий результат:
$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD'
MsgBox(0, 'Строка для reg-файла', _StringToRegFileFormat($sSerial, 'REG_EXPAND_SZ'))
Func _StringToRegFileFormat($sData, $sType, $iSlash=10)
Local $sHex, $iHexLength, $aData, $sDataResult, $i, $j=4
If $iSlash < 0 OR ($iSlash > 0 AND $iSlash < 4) Then $iSlash = 4
Switch $sType
Case 'REG_DWORD'
Return 'dword:' & Hex($sData, 8)
Case 'REG_BINARY'
$sType = 'hex:'
$iHexLength = 3
Case 'REG_EXPAND_SZ'
$sType = 'hex(2):'
$iHexLength = 2
Case 'REG_MULTI_SZ'
$sType = 'hex(7):'
$iHexLength = 7
Case Else
Return '"' & $sData & '"'
EndSwitch
$sData = StringLower(Hex(StringToBinary($sData, 2), $iHexLength))
For $i=1 To StringLen($sData) Step 2
$sDataResult &= StringMid($sData, $i, 2) & ','
If $j == $iSlash Then
$j = 0
$sDataResult &= '\' & @CRLF
EndIf
$j += 1
Next
Return $sType & $sDataResult & '00,00'
EndFunc
Цитата:
|
|
|
------- Последний раз редактировалось proxy, 24-06-2009 в 04:51. Отправлено: 03:17, 24-06-2009 | #11 |
|
Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Цитата semiono:
Если длина строки более 76 символов - выполняется перенос. Следующая строка содержит в начале два пробела. Вроде что-то написал Работает вроде правильно. Пока проблемка с нулевым значением. Да и сам код выглядит громоздко. |
|
|
------- Отправлено: 12:12, 24-06-2009 | #12 |
|
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Цитата:
|
|
|
------- Отправлено: 12:27, 24-06-2009 | #13 |
|
Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Да.
Изменил немного. Стало меньше. Но всё равно много (хотя, в принципе, знаю как ещё больше можно уменьшить): Func RegValueReadAndConvert($KeyName, $ValueName)
Local $Data = RegRead($KeyName, $ValueName)
Local $Type = @extended
Local $Return = '"' & $ValueName & '"='
Local $Temp = ""
Local $ArrT[1]
Switch $Type
Case $REG_SZ
Return $Return & '"' & $Data & '"'
Case $REG_EXPAND_SZ
$Data = StringReplace(StringToBinary($Data, 2), "0x", "")
$Temp = $Return & "hex(2):"
$Length = StringLen($Data) / 2
For $i = 1 To $Length + 3
If $I < $Length + 1 Then
$Temp &= StringMid($Data, $I * 2 - 1, 2) & ","
Else
$Temp &= "00"
If $I < $Length + 3 Then $Temp &= ","
EndIf
$ArrT = StringSplit($Temp, @LF)
If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & " " ; два пробела
Next
Return $Temp
Case $REG_BINARY
$Data = StringReplace($Data, "0x", "")
$Temp = $Return & "hex:"
For $i = 1 To StringLen($Data) / 2 - 1
$Temp &= StringMid($Data, $I * 2 - 1, 2) & ","
$ArrT = StringSplit($Temp, @LF)
If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & " " ; два пробела
Next
$Temp &= StringMid($Data, StringLen($Data) - 1, 2)
Return $Temp
Case $REG_DWORD
Return $Return & "dword:" & Hex($Data)
Case $REG_MULTI_SZ
$Data = StringReplace(StringToBinary($Data, 2), "0x", "")
$Temp = $Return & "hex(2):"
$Length = StringLen($Data) / 2
For $i = 1 To $Length + 4
If $I < $Length + 1 Then
$Temp &= StringMid($Data, $I * 2 - 1, 2) & ","
Else
$Temp &= "00"
If $I < $Length + 4 Then $Temp &= ","
EndIf
$ArrT = StringSplit($Temp, @LF)
If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & " " ; два пробела
Next
Return $Temp
EndSwitch
EndFunc
|
|
------- Отправлено: 12:31, 24-06-2009 | #14 |
|
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать + мой вариант:
#region: - Options
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion
Local $sFilePath = 'd:\reg.reg'
Local $sRegKey = 'HKEY_LOCAL_MACHINE\SYSTEM'
Local $sValueName = 'SN'
Local $sValueType = 'REG_EXPAND_SZ'
Local $fAllInKey = 1
Local $iSlash = 10
_CreatRegFile($sFilePath, $sRegKey, $sValueName, $sValueType, $fAllInKey, $iSlash)
Func _CreatRegFile($sFilePath, $sRegKey, $sValueName, $sValueType, $fAllInKey=0, $iSlash=10)
Local Const $REG_SZ = 1
Local Const $REG_EXPAND_SZ = 2
Local Const $REG_BINARY = 3
Local Const $REG_DWORD = 4
Local Const $REG_MULTI_SZ = 7
Local $hFile, $i=1
Local $sFileContent = 'Windows Registry Editor Version 5.00'
$sRegKey = StringRegExpReplace($sRegKey, '\\+$', '')
While 1
If $fAllInKey Then
$sValueName = RegEnumVal($sRegKey, $i)
If @error <> 0 Then ExitLoop
Switch @extended
Case $REG_SZ
$sValueType = 'REG_SZ'
Case $REG_EXPAND_SZ
$sValueType = 'REG_EXPAND_SZ'
Case $REG_BINARY
$sValueType = 'REG_BINARY'
Case $REG_DWORD
$sValueType = 'REG_DWORD'
Case $REG_MULTI_SZ
$sValueType = 'REG_MULTI_SZ'
EndSwitch
EndIf
$sFileContent &= @CRLF & @CRLF & '[' & $sRegKey & ']' & @CRLF & _StringToRegFileFormat($sValueName, RegRead($sRegKey, $sValueName), $sValueType, $iSlash)
If NOT $fAllInKey Then ExitLoop
$i += 1
WEnd
$hFile = FileOpen($sFilePath, 8+2)
FileWrite($hFile, $sFileContent)
FileClose($hFile)
EndFunc
Func _StringToRegFileFormat($sName, $sData, $sType, $iSlash=10)
Local $sHex, $iHexLength, $iNameLen, $iStartLen, $aResult, $sResult, $i
Switch $sType
Case 'REG_DWORD'
Return 'dword:' & Hex($sData, 8)
Case 'REG_BINARY'
$sType = 'hex:'
$iHexLength = 3
Case 'REG_EXPAND_SZ'
$sType = 'hex(2):'
$iHexLength = 2
Case 'REG_MULTI_SZ'
$sType = 'hex(7):'
$iHexLength = 7
Case Else
Return '"' & $sData & '"'
EndSwitch
$iNameLen = Floor(StringLen($sName & $sType) / 2)
$sResult = StringLower(Hex(StringToBinary($sData, 2), 2)) & '0000'
If StringLen($sResult)+(StringLen($sResult)/2)-1 > 76 Then $iSlash = 10
If $iNameLen > $iSlash Then
$iStartLen = 0
Else
$iStartLen = $iSlash - $iNameLen + 6
EndIf
If StringLen($sResult)+(StringLen($sResult)/2)-1 < StringLen($sName & $sType) Then $iSlash = 0
If $iNameLen < $iStartLen Then $iStartLen = $iSlash - $iNameLen + $iSlash-4
If Mod($iStartLen, 2) <> 0 Then $iStartLen += 1
Dim $aResult[2]
$aResult[0] = StringLeft($sResult, $iStartLen)
$aResult[1] = StringMid($sResult, $iStartLen+1)
For $i=0 To 1
$aResult[$i] = StringRegExpReplace($aResult[$i], '([a-z0-9]{2,2})', '\1,')
If $i Then
If $iSlash Then $aResult[$i] = '\' & @CRLF & StringRegExpReplace($aResult[$i], '(.{' & ($iSlash*3)-1 & '},)', '\1\\' & @CRLF)
$aResult[$i] = StringRegExpReplace($aResult[$i], ',+$', '')
EndIf
Next
$sResult = $aResult[0] & $aResult[1]
Return '"' & $sName & '"=' & $sType & $sResult & @CRLF
EndFunc
Учтено: длина строки < 76, и @CRLF в конце. Уже лучше расставляются слеши, вся разбивка на StringRegExpReplace. |
|
------- Последний раз редактировалось proxy, 24-06-2009 в 22:21. Отправлено: 14:30, 24-06-2009 | #15 |
|
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Sylver Dragon:
Local Const $REG_SZ = 1 Local Const $REG_EXPAND_SZ = 2 Local Const $REG_BINARY = 3 Local Const $REG_DWORD = 4 Local Const $REG_MULTI_SZ = 7 Hex конвертацию можно упростить: $sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD' MsgBox(0, $sSerial, Hex(StringToBinary($sSerial, 2), 7)) Расстановка запятых, так не проще? $sData = 'VMKJGNDIDNWLDMKJGNDIDNWLD'
For $i=1 To StringLen($sData) Step 2
$sDataResult &= StringMid($sData, $i, 2) & ','
Next
MsgBox(0, $sData, $sDataResult)
Расстановка запятых + слеши: |
|
------- Отправлено: 14:56, 24-06-2009 | #16 |
|
Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Разве всё надо в hex конвертить?
Цитата proxy:
Цитата proxy:
|
||
|
------- Отправлено: 15:08, 24-06-2009 | #17 |
|
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Цитата Sylver Dragon:
Цитата:
Закрывающие нули: Цитата:
Удаление запятой: Цитата:
Цитата:
Цитата:
...обновил.. |
||||||
|
------- Последний раз редактировалось proxy, 24-06-2009 в 17:56. Отправлено: 17:44, 24-06-2009 | #18 |
|
Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать StringRegExpReplace($TempValue, "([^,]{2})", "$0,") - расстановка запятых после каждого второго символа (в конце тоже будет).
Цитата proxy:
Цитата proxy:
Плюс, после каждого раздела следует ещё один @CRLF |
||
|
------- Отправлено: 18:27, 24-06-2009 | #19 |
|
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Цитата Sylver Dragon:
Круть!! |
|
|
------- Отправлено: 18:52, 24-06-2009 | #20 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| VBS/WHS/JS - синтаксис On Error | Dr.Dark | Программирование и базы данных | 8 | 26-08-2008 11:42 | |
| Delphi - Синтаксис масивов в Паскале | verdix | Программирование и базы данных | 3 | 13-05-2008 16:36 | |
| Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI | DillerInc | Программирование и базы данных | 60 | 13-03-2006 21:36 | |
| Синтаксис setup.iss | ags | Автоматическая установка приложений | 11 | 06-03-2006 07:58 | |
| синтаксис php | Вебмастеру | 6 | 03-03-2005 22:42 | ||
|