[решено] Изменить значение параметра — Не INI файл!

Ответить
 • Просмотры: 1
Аватара пользователя
semiono

[решено] Изменить значение параметра — Не INI файл!

Сообщение semiono »

Синтаксис обычный: параметр = значение, номер строки не известен.

Текущее значение неизвестно, и даже может быть пустым.

Например:

position.width=1152

position.height=816



Здесь видимо можно обрубить по знаку равенства "=" через StringRegExp(), но я не знаю как...



---

Я уже думал нашёл решение, просто переименовав файл, но проблемма оказалась в том,

что файл вдобавок не имеет секций []
Аватара пользователя
semiono

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение semiono »

Вчера до ночи сидел, правда у меня сидение малопродуктивное, сейчас буду посмотреть.

Про SciTE верно, я сам подумал, что он может вносить изменения, ведь это его конфиг,

однако сразу же засомневался, так как я в основном кликом скрипт открывал.

Ещё одна идея есть о том, что я в папке профиля чудил, а на папки профиля сколько помню

в различных логах выводится, что файл защищён правами... нечто такое помню...

Но не будем об этом, пусть спишется как странный глюк непонятный ))

Ещё возможно, что я быстро файл открывал посмотреть, и якобы он не весь прописался,

такое тоже вероятно, но тогда получается, что скрипт слишком уж доооолго работает!

Ладно с этим понятно, раз уж всё разложили по полочкам буду доверять коду.

Только теперь не знаю что лучше, все три варианта, но Creat0R,

интригующе самый солидный скрипт! Ок!



Кстати, я уже говорил давно, жаль что такого простого среди функций нет.

А самое лучшее бы было из ini- функций как-то превратить, так как там именно под задачу заточенно,

возможно я ошибаюсь. И конечно возмутительно что FileWright пишет дополнение в конец файла,

кому такая наивность тут нужна! Эх autoit3.com (C) всё чаще разочароывает, так как идея скриптов

идея быстрого и простого создания скриптов... 8-)
Аватара пользователя
semiono

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение semiono »

Можешь набросать как примерно? Потому что я с записью и удалением секции "нагорожу забор"!

Лучше посмотреть как это адекватно зделать.



Вот сам текст примерно такой





Код:

Код: Выделить всё

# SciTE session file
position.left=0
position.top=0
position.width=1152
position.height=816
position.maximize=1
mru.1.path=J:\[\Pebind\Alcohol\Patch\Script\Setup.au3
mru.2.path=H:\[\ENTRIES.au3
mru.3.path=C:\I\WinSxS\Process\New AutoIt v3 Script.au3
buffer.1.path=C:\I\WinSxS\Process\New AutoIt v3 Script.au3
buffer.1.position=46
buffer.1.current=1

А как можно секцию [test] вписать в начало файла или перед нужной строкой?
Аватара пользователя
kaster

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение kaster »

semiono, ну добавь секцию руками, обработай как INI, потом снова удали секцию.
Аватара пользователя
madmasles

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение madmasles »

semiono,

Можно так попробовать:

Код:

Код: Выделить всё

$sStringW = 'position.width='
$sStringH = 'position.height='
$hFile = FileOpen(@UserProfileDir & '\SciTE.session', 0)
$sText = FileRead($hFile)
FileClose($hFile)
MsgBox(0, '', $sText)
$sText = StringRegExpReplace($sText, $sStringW & '\d{3,4}', $sStringW & @DesktopWidth)
$sText = StringRegExpReplace($sText, $sStringH & '\d{3,4}', $sStringH & @DesktopHeight)
MsgBox(0, '', $sText)
Аватара пользователя
kaster

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение kaster »

Код:

Код: Выделить всё

$sPath = @ScriptDir & '\SciTE.session'; Scite.Session file path'
$sContent = '[Some Section]' & @CRLF & FileRead($sPath)
ConsoleWrite($sContent & @CRLF)
$hWrite = FileOpen($sPath, 2)
FileWrite($hWrite, $sContent)
FileClose($hWrite)
IniWrite($sPath, 'Some Section', 'position.width', @DesktopWidth)
IniWrite($sPath, 'Some Section', 'position.height', @DesktopHeight)
$hRead = FileOpen($sPath, 0)
FileReadLine($hRead)
$sContent = FileRead($hRead)
FileClose($hRead)
$hWrite = FileOpen($sPath, 2)
FileWrite($hWrite, $sContent)
FileClose($sContent)
Аватара пользователя
semiono

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение semiono »

kaster, работает правильно как бы, но такое наблюдение, что снизу файл начинает зачищаться.

То-есть файл становиться всё меньше с каждым запуском снизу и даже начинает затирать сами строки position.width=1152 position.height=816... странно!



madmasles, если начальные значения не соответствуют разрядности, то не работает. Изображение

То-есть 1111 > 1152 нормально! Но 111 > не станет 1152
Аватара пользователя
kaster

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение kaster »

semiono,

Как скрипт kaster`a, так и мой отрабатывает у меня как надо. Если Вы его запускаете из открытого окна SciTE, то он возвращает старые значения. Закройте окно SciTE и запустите скрипт правой кнопкой через Run Script.


Цитата semiono:



если начальные значения не соответствуют разрядности
[решено] Изменить значение параметра — Не INI файл!




'\d{3,4}' значит любые 3 или 4 цифры подряд (от 000 до 9999). Можно для надежности поменять на '\d{1,4}' (0 - 9999). Изображение
Аватара пользователя
madmasles

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение madmasles »

Вот функция которую я когда то писал для обработки ключей в файлах *.properties:





Код:

Код: Выделить всё

#include <Array.au3>
_FilePropertyWrite("File.properties", "Scripts", "MyScript.au3|SomeScript1.au3|SomeScript2.au3|SomeScript3.au3")
$aProperty = _FilePropertyRead("File.properties", "Scripts", "", 1)
_ArrayDisplay($aProperty)
Func _FilePropertyRead($sFile, $sProperty, $sDefault = "", $iRetArr = 1)
    Local $aFileRead = StringSplit(StringStripCR(FileRead($sFile)), @LF)
    Local $sRet, $sPattern = '(?i)^\s*\Q' & $sProperty & '\E\s*=\s*'
    For $i = 1 To $aFileRead[0]
        If StringRegExp($aFileRead[$i], $sPattern) Then
            $aFileRead[$i] = StringRegExpReplace($aFileRead[$i], $sPattern, '')
            If StringRight($aFileRead[$i], 1) = "\" Then
                $aFileRead[$i] = StringTrimRight($aFileRead[$i], 1)
            EndIf
            $sRet &= StringStripWS($aFileRead[$i], 3)
            For $j = $i+1 To $aFileRead[0]
                If StringInStr($aFileRead[$j], "=") Then
                    ExitLoop 2
                ElseIf StringLeft(StringStripWS($aFileRead[$j], 1), 1) <> "#" Then
                    If StringRight($aFileRead[$j], 1) = "\" Then
                        $aFileRead[$j] = StringTrimRight($aFileRead[$j], 1)
                    EndIf
                    $sRet &= " " & StringStripWS($aFileRead[$j], 3)
                EndIf
            Next
            ExitLoop
        EndIf
    Next
    If $sRet == "" Then
        $sRet = $sDefault
    Else
        $sRet = StringStripWS($sRet, 3)
    EndIf
    If $iRetArr Then
        Return StringSplit($sRet, "     ")
    EndIf
    Return $sRet
EndFunc
Func _FilePropertyWrite($sFile, $sProperty, $sValue, $iInsInLine = -1, $iPropsPerLine = 5)
    Local $aFileRead = StringSplit(StringStripCR(FileRead($sFile)), @LF)
    Local $sPropPattern = '(?i)^\s*(\Q' & $sProperty & '\E)\s*=\s*.*'
    Local $sKeyPattern = '^\s*([^=]+\s*=\s*|#)'
    Local $hFile, $sFileContent, $aValue, $sLine, $iPropFound = 0
    $aValue = StringSplit(StringReplace($sValue, '\', ''), '|')
    $sValue = ''
    For $i = 1 To $aValue[0]
        $sValue &= $aValue[$i]
        If $i < $aValue[0] Then
            If $i = 1 Or Mod($i - 1, $iPropsPerLine) = 0 Then
                $sValue &= ' \' & @CRLF & @TAB
            Else
                $sValue &= ' '
            EndIf
        EndIf
    Next
    For $i = 1 To $aFileRead[0]
        $sLine = $aFileRead[$i]
        If StringRegExp($aFileRead[$i], $sPropPattern) Then
            If $iInsInLine = -1 Then
                $iPropFound = 1
                $sLine = StringRegExpReplace($aFileRead[$i], $sPropPattern, '\1=' & StringReplace($sValue, '\', '\\'))
            EndIf
            For $j = $i+1 To $aFileRead[0]
                If StringRegExp($aFileRead[$j], $sKeyPattern) Or $i >= $aFileRead[0] Then
                    ExitLoop
                EndIf
                $i += 1
            Next
            If $iInsInLine <> -1 Then
                ContinueLoop
            EndIf
        EndIf
        $sFileContent &= $sLine
        If $i < $aFileRead[0] Then
            $sFileContent &= @CRLF
        EndIf
    Next
    If $iInsInLine <> -1 Then
        $aFileRead = StringSplit(StringStripCR($sFileContent), @LF)
        $sFileContent = ''
        For $i = 1 To $aFileRead[0]
            If $i = $iInsInLine Then
                $iPropFound = 1
                $sFileContent &= $sProperty & "=" & $sValue & @CRLF & $aFileRead[$i]
            Else
                $sFileContent &= $aFileRead[$i]
            EndIf
            If $i < $aFileRead[0] Then
                $sFileContent &= @CRLF
            EndIf
        Next
    EndIf
    If Not $iPropFound Then
        If $sFileContent <> '' And StringRight($sFileContent, 2) <> @CRLF Then
            $sFileContent &= @CRLF
        EndIf
        $sFileContent &= $sProperty & "=" & $sValue
    EndIf
    $hFile = FileOpen($sFile, 2)
    FileWrite($hFile, $sFileContent)
    Return FileClose($hFile)
EndFunc

работает также с многострочными значениями (разделённые слешем «\»).
Аватара пользователя
Creat0R

Re: [решено] Изменить значение параметра — Не INI файл!

Сообщение Creat0R »

Вот функция которую я когда то писал для обработки ключей в файлах *.properties:





Код:

Код: Выделить всё

#include <Array.au3>
_FilePropertyWrite("File.properties", "Scripts", "MyScript.au3|SomeScript1.au3|SomeScript2.au3|SomeScript3.au3")
$aProperty = _FilePropertyRead("File.properties", "Scripts", "", 1)
_ArrayDisplay($aProperty)
Func _FilePropertyRead($sFile, $sProperty, $sDefault = "", $iRetArr = 1)
    Local $aFileRead = StringSplit(StringStripCR(FileRead($sFile)), @LF)
    Local $sRet, $sPattern = '(?i)^\s*\Q' & $sProperty & '\E\s*=\s*'
    For $i = 1 To $aFileRead[0]
        If StringRegExp($aFileRead[$i], $sPattern) Then
            $aFileRead[$i] = StringRegExpReplace($aFileRead[$i], $sPattern, '')
            If StringRight($aFileRead[$i], 1) = "\" Then
                $aFileRead[$i] = StringTrimRight($aFileRead[$i], 1)
            EndIf
            $sRet &= StringStripWS($aFileRead[$i], 3)
            For $j = $i+1 To $aFileRead[0]
                If StringInStr($aFileRead[$j], "=") Then
                    ExitLoop 2
                ElseIf StringLeft(StringStripWS($aFileRead[$j], 1), 1) <> "#" Then
                    If StringRight($aFileRead[$j], 1) = "\" Then
                        $aFileRead[$j] = StringTrimRight($aFileRead[$j], 1)
                    EndIf
                    $sRet &= " " & StringStripWS($aFileRead[$j], 3)
                EndIf
            Next
            ExitLoop
        EndIf
    Next
    If $sRet == "" Then
        $sRet = $sDefault
    Else
        $sRet = StringStripWS($sRet, 3)
    EndIf
    If $iRetArr Then
        Return StringSplit($sRet, "     ")
    EndIf
    Return $sRet
EndFunc
Func _FilePropertyWrite($sFile, $sProperty, $sValue, $iInsInLine = -1, $iPropsPerLine = 5)
    Local $aFileRead = StringSplit(StringStripCR(FileRead($sFile)), @LF)
    Local $sPropPattern = '(?i)^\s*(\Q' & $sProperty & '\E)\s*=\s*.*'
    Local $sKeyPattern = '^\s*([^=]+\s*=\s*|#)'
    Local $hFile, $sFileContent, $aValue, $sLine, $iPropFound = 0
    $aValue = StringSplit(StringReplace($sValue, '\', ''), '|')
    $sValue = ''
    For $i = 1 To $aValue[0]
        $sValue &= $aValue[$i]
        If $i < $aValue[0] Then
            If $i = 1 Or Mod($i - 1, $iPropsPerLine) = 0 Then
                $sValue &= ' \' & @CRLF & @TAB
            Else
                $sValue &= ' '
            EndIf
        EndIf
    Next
    For $i = 1 To $aFileRead[0]
        $sLine = $aFileRead[$i]
        If StringRegExp($aFileRead[$i], $sPropPattern) Then
            If $iInsInLine = -1 Then
                $iPropFound = 1
                $sLine = StringRegExpReplace($aFileRead[$i], $sPropPattern, '\1=' & StringReplace($sValue, '\', '\\'))
            EndIf
            For $j = $i+1 To $aFileRead[0]
                If StringRegExp($aFileRead[$j], $sKeyPattern) Or $i >= $aFileRead[0] Then
                    ExitLoop
                EndIf
                $i += 1
            Next
            If $iInsInLine <> -1 Then
                ContinueLoop
            EndIf
        EndIf
        $sFileContent &= $sLine
        If $i < $aFileRead[0] Then
            $sFileContent &= @CRLF
        EndIf
    Next
    If $iInsInLine <> -1 Then
        $aFileRead = StringSplit(StringStripCR($sFileContent), @LF)
        $sFileContent = ''
        For $i = 1 To $aFileRead[0]
            If $i = $iInsInLine Then
                $iPropFound = 1
                $sFileContent &= $sProperty & "=" & $sValue & @CRLF & $aFileRead[$i]
            Else
                $sFileContent &= $aFileRead[$i]
            EndIf
            If $i < $aFileRead[0] Then
                $sFileContent &= @CRLF
            EndIf
        Next
    EndIf
    If Not $iPropFound Then
        If $sFileContent <> '' And StringRight($sFileContent, 2) <> @CRLF Then
            $sFileContent &= @CRLF
        EndIf
        $sFileContent &= $sProperty & "=" & $sValue
    EndIf
    $hFile = FileOpen($sFile, 2)
    FileWrite($hFile, $sFileContent)
    Return FileClose($hFile)
EndFunc

работает также с многострочными значениями (разделённые слешем «\»).
Ответить

Вернуться в «AutoIt»