[решено] Изменить значение параметра — Не INI файл!
-
semiono
[решено] Изменить значение параметра — Не INI файл!
Синтаксис обычный: параметр = значение, номер строки не известен.
Текущее значение неизвестно, и даже может быть пустым.
Например:
position.width=1152
position.height=816
Здесь видимо можно обрубить по знаку равенства "=" через StringRegExp(), но я не знаю как...
---
Я уже думал нашёл решение, просто переименовав файл, но проблемма оказалась в том,
что файл вдобавок не имеет секций []
Текущее значение неизвестно, и даже может быть пустым.
Например:
position.width=1152
position.height=816
Здесь видимо можно обрубить по знаку равенства "=" через StringRegExp(), но я не знаю как...
---
Я уже думал нашёл решение, просто переименовав файл, но проблемма оказалась в том,
что файл вдобавок не имеет секций []
-
semiono
Re: [решено] Изменить значение параметра — Не INI файл!
Вчера до ночи сидел, правда у меня сидение малопродуктивное, сейчас буду посмотреть.
Про SciTE верно, я сам подумал, что он может вносить изменения, ведь это его конфиг,
однако сразу же засомневался, так как я в основном кликом скрипт открывал.
Ещё одна идея есть о том, что я в папке профиля чудил, а на папки профиля сколько помню
в различных логах выводится, что файл защищён правами... нечто такое помню...
Но не будем об этом, пусть спишется как странный глюк непонятный ))
Ещё возможно, что я быстро файл открывал посмотреть, и якобы он не весь прописался,
такое тоже вероятно, но тогда получается, что скрипт слишком уж доооолго работает!
Ладно с этим понятно, раз уж всё разложили по полочкам буду доверять коду.
Только теперь не знаю что лучше, все три варианта, но Creat0R,
интригующе самый солидный скрипт! Ок!
Кстати, я уже говорил давно, жаль что такого простого среди функций нет.
А самое лучшее бы было из ini- функций как-то превратить, так как там именно под задачу заточенно,
возможно я ошибаюсь. И конечно возмутительно что FileWright пишет дополнение в конец файла,
кому такая наивность тут нужна! Эх autoit3.com (C) всё чаще разочароывает, так как идея скриптов
идея быстрого и простого создания скриптов...
Про SciTE верно, я сам подумал, что он может вносить изменения, ведь это его конфиг,
однако сразу же засомневался, так как я в основном кликом скрипт открывал.
Ещё одна идея есть о том, что я в папке профиля чудил, а на папки профиля сколько помню
в различных логах выводится, что файл защищён правами... нечто такое помню...
Но не будем об этом, пусть спишется как странный глюк непонятный ))
Ещё возможно, что я быстро файл открывал посмотреть, и якобы он не весь прописался,
такое тоже вероятно, но тогда получается, что скрипт слишком уж доооолго работает!
Ладно с этим понятно, раз уж всё разложили по полочкам буду доверять коду.
Только теперь не знаю что лучше, все три варианта, но Creat0R,
интригующе самый солидный скрипт! Ок!
Кстати, я уже говорил давно, жаль что такого простого среди функций нет.
А самое лучшее бы было из ini- функций как-то превратить, так как там именно под задачу заточенно,
возможно я ошибаюсь. И конечно возмутительно что FileWright пишет дополнение в конец файла,
кому такая наивность тут нужна! Эх autoit3.com (C) всё чаще разочароывает, так как идея скриптов
идея быстрого и простого создания скриптов...
-
semiono
Re: [решено] Изменить значение параметра — Не INI файл!
Можешь набросать как примерно? Потому что я с записью и удалением секции "нагорожу забор"!
Лучше посмотреть как это адекватно зделать.
Вот сам текст примерно такой
Код:
А как можно секцию [test] вписать в начало файла или перед нужной строкой?
Лучше посмотреть как это адекватно зделать.
Вот сам текст примерно такой
Код:
Код: Выделить всё
# 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 файл!
semiono, ну добавь секцию руками, обработай как INI, потом снова удали секцию.
-
madmasles
Re: [решено] Изменить значение параметра — Не INI файл!
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 файл!
Код:
Код: Выделить всё
$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 файл!
kaster, работает правильно как бы, но такое наблюдение, что снизу файл начинает зачищаться.
То-есть файл становиться всё меньше с каждым запуском снизу и даже начинает затирать сами строки position.width=1152 position.height=816... странно!
madmasles, если начальные значения не соответствуют разрядности, то не работает.
То-есть 1111 > 1152 нормально! Но 111 > не станет 1152
То-есть файл становиться всё меньше с каждым запуском снизу и даже начинает затирать сами строки position.width=1152 position.height=816... странно!
madmasles, если начальные значения не соответствуют разрядности, то не работает.

То-есть 1111 > 1152 нормально! Но 111 > не станет 1152
-
kaster
Re: [решено] Изменить значение параметра — Не INI файл!
semiono,
Как скрипт kaster`a, так и мой отрабатывает у меня как надо. Если Вы его запускаете из открытого окна SciTE, то он возвращает старые значения. Закройте окно SciTE и запустите скрипт правой кнопкой через Run Script.
Цитата semiono:
если начальные значения не соответствуют разрядности
'\d{3,4}' значит любые 3 или 4 цифры подряд (от 000 до 9999). Можно для надежности поменять на '\d{1,4}' (0 - 9999).
Как скрипт kaster`a, так и мой отрабатывает у меня как надо. Если Вы его запускаете из открытого окна SciTE, то он возвращает старые значения. Закройте окно SciTE и запустите скрипт правой кнопкой через Run Script.
Цитата semiono:
если начальные значения не соответствуют разрядности
[решено] Изменить значение параметра — Не INI файл!
'\d{3,4}' значит любые 3 или 4 цифры подряд (от 000 до 9999). Можно для надежности поменять на '\d{1,4}' (0 - 9999).

-
madmasles
Re: [решено] Изменить значение параметра — Не INI файл!
Вот функция которую я когда то писал для обработки ключей в файлах *.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 файл!
Вот функция которую я когда то писал для обработки ключей в файлах *.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работает также с многострочными значениями (разделённые слешем «\»).