Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   запись аргументов в формате файлов INF (http://forum.oszone.net/showthread.php?t=217908)

semiono 13-10-2011 22:56 1772808

запись аргументов в формате файлов INF
 
Исходный текст файла:
Код:

[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 1772900

Цитата:

Цитата semiono
Вообщем кто имеет что сказать? »

Не понятно, в чём у Вас, собственно, проблема.

semiono 14-10-2011 03:17 1772927

Например, в файл
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 1772930

Цитата:

Цитата semiono
Нужна функция или процедура чтобы записывать данные в файл в формате: »

Примерно так:

Код:

_RegFileWrite(@ScriptDir & '\File.reg', 'Add.Reg', 1, 'данные... 0x00000000 | "C:\zzzz" | 00 01 02 03 итп.')

Func _RegFileWrite($sFile, $sSect, $iKey, $sValue)
    Local $sReadFile, $sReadSect, $aSplit, $sTmpSect, $i, $hFile

    $sReadFile = FileRead($sFile)

    If Not @extended Then
        Return SetError(1)
    EndIf

    $sReadSect = StringRegExpReplace($sReadFile, "(?s).*?(\Q[" & $sSect & "]\E.*?)[\r\n]*(\[.*|$)", "\1")
    $aSplit = StringSplit(StringStripCR($sReadSect), @LF)

    For $i = 1 To $aSplit[0]
        If $i = $iKey + 1 Then
            $sTmpSect &= $sValue & @CRLF
        Else
            $sTmpSect &= $aSplit[$i] & @CRLF
        EndIf
    Next

    $sReadFile = StringReplace($sReadFile, $sReadSect, StringTrimRight($sTmpSect, 2))

    $hFile = FileOpen($sFile, 2)

    If $hFile = -1 Then
        Return SetError(2)
    EndIf

    FileWrite($hFile, $sReadFile)
    FileClose($hFile)
EndFunc


semiono 14-10-2011 22:31 1773583

а продолжение можно попросить?

Найти:
[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,1 6
; ...

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

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

Creat0R 19-10-2011 00:22 1776507

Цитата:

Цитата semiono
продолжение можно попросить? »

Попросить можно, но вот не знаю кто это реализует, у меня лично ушло слишком много времени на попытку, т.ч я пока пас, сорри :(


Время: 02:04.

Время: 02:04.
© OSzone.net 2001-