Войти

Показать полную графическую версию : запись аргументов в формате файлов INF


semiono
13-10-2011, 22:56
Исходный текст файла:
[Version]
Signature=$Windows NT$

[DefaultInstall]
AddReg=Add.Reg

[Add.Reg]
HKLM,"Software\Classes\FSTFile\Shell\Open\Command","",0x00004000,"C:\FL.exe" "%1"

Нужно изменить на такое:
HKLM,"Software\Classes\FSTFile\Shell\Open\Command","",0x00004000,"D:\zzz\zzz\FL.exe" "%1" %*

А так же изменить SubKey: "Software\Classes\FSTFile\Shell\Open\Command" и тип данных: 0x00004000 на другие значения.

Если посмотреть на формат, то получается:
ROOT, SubKey, KeyName, Type, значение...
с последним параметром могут быть сложности, так как он зависит от типа данных и может содержать пробелы и всякие знаки...

Вообщем кто имеет что сказать? :)

Iska
14-10-2011, 02:12
Вообщем кто имеет что сказать? »
Не понятно, в чём у Вас, собственно, проблема.

semiono
14-10-2011, 03:17
Например, в файл
D:\DVD\i386\HIVESYS.INF
в секцию
[AddReg]
нужно добавить строки:
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.BitsPerPel",0x00010001,32
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.XResolution",0x00010001,1024
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.YResolution",0x00010001,768
HKLM,"SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000","DefaultSettings.BitsPerPel",0x00010001,32
HKLM,"SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000","DefaultSettings.XResolution",0x00010001,1024
HKLM,"SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000","DefaultSettings.YResolution",0x00010001,768

Но если там уже есть эти параметры реестра, то нужно только изменить их значения чтобы строки не дублировались.
Это типично для формата INI, только здесь отсутствует знак равенства: DefaultSettings.BitsPerPel=32

Creat0R
14-10-2011, 03:55
Нужна функция или процедура чтобы записывать данные в файл в формате: »
Примерно так:

_RegFileWrite(@ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptdir) & '\File.reg', 'Add.Reg', 1, 'данные... 0x00000000 | "C:\zzzz" | 00 01 02 03 итп.')

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _RegFileWrite($sFile, $sSect, $iKey, $sValue)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sReadFile, $sReadSect, $aSplit, $sTmpSect, $i, $hFile

$sReadFile = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sFile)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) @extended (http://www.autoitscript.com/autoit3/docs/macros.htm#@extended) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

$sReadSect = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sReadFile, "(?s).*?(\Q[" & $sSect & "]\E.*?)[\r\n]*(\[.*|$)", "\1")
$aSplit = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)(StringStripCR (http://www.autoitscript.com/autoit3/docs/functions/StringStripCR.htm)($sReadSect), @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf))

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aSplit[0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $i = $iKey + 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sTmpSect &= $sValue & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sTmpSect &= $aSplit[$i] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

$sReadFile = StringReplace (http://www.autoitscript.com/autoit3/docs/functions/StringReplace.htm)($sReadFile, $sReadSect, StringTrimRight (http://www.autoitscript.com/autoit3/docs/functions/StringTrimRight.htm)($sTmpSect, 2))

$hFile = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile, 2)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hFile = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(2)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hFile, $sReadFile)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

semiono
14-10-2011, 22:31
а продолжение можно попросить?

Найти:
[AddReg]
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.BitsPerPel"

и добавить значение:
,0x00010001,32

должно получиться так:

[AddReg]
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device1","DefaultSettings.BitsPerPel",0x00010001,16
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device2","DefaultSettings.BitsPerPel",0x00010001,16
; ...
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.BitsPerPel",0x00010001,32
; ...
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","zzDefaultSettings.BitsPerPel",0x00010001,16
; ...

Если файл не существует его нужно создать, если секция не существует её нужно создать, если строка не найдена её нужно создать.

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

Creat0R
19-10-2011, 00:22
продолжение можно попросить? »
Попросить можно, но вот не знаю кто это реализует, у меня лично ушло слишком много времени на попытку, т.ч я пока пас, сорри :(




© OSzone.net 2001-2012