wangms 发表于 2014-7-30 22:49:02

求教非标Ini文件行删除修改操作

本帖最后由 wangms 于 2014-7-31 11:12 编辑

配置文件:

!|!tb|!jd|!ymx|!163|!gg1|!115|!116|!139|!aux|!auc|!ahk|!188|!efz|!efq|!xy|!oa|!pt|!gb|!gt|!lr|!yy|!bb
bd|Mozilla Firefox\firefox.exe|http://www.baidu.com/baidu?wd=%s&cl=3
gg|Mozilla Firefox\firefox.exe|https://www.google.com.hk/search?inlang=zh-CN&newwindow=1&safe=strict&hl=zh-CN&q=%s&oq=wome&gs_l=serp.3.2.0i2l10.17420.17986.0.20758.4.4.0.0.0.0.305.488.0j1j0j1.2.0....0...1c.1.45.serp..2.2.484.v3a8e3RZXxU

dict|Mozilla Firefox\firefox.exe|http://dictionary.reference.com/search?q=%s
iciba|Mozilla Firefox\firefox.exe|http://www.iciba.com/search?s=%s&t=word&lang=utf-8

mywd|explorer|::{450D8FBA-AD25-11D0-98A8-0800361B1103} ||||||我的文档
sx|Mozilla Firefox\firefox.exe|http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=%1

fy|Mozilla Firefox\firefox.exe|http://fanyi.baidu.com/translate#en/zh/%s
chen|Mozilla Firefox\firefox.exe|http://www.worldlingo.com/wl/mstranslate/UP26384/T1/P2/l/microsoft/computer_translation.html?wl_lp=ZH_CN-EN&wl_fl=0&wl_rurl=http%3A%2F%2F%s%2F&wl_url=%s&wlg_table=-3
ruen|Mozilla Firefox\firefox.exe|http://www.translate.ru/url/tran_url.asp?lang=ru&url=%s&direction=re&template=General&cp1=NO&cp2=NO&autotranslate=on&transliterate=on&psubmit2.x=50&psubmit2.y=12

lx|Mozilla Firefox\firefox.exe|http://www.55188.com/forum-68-1.html

gh|Mozilla Firefox\firefox.exe|https://vip.icbc.com.cn/icbc/perbank/index.jsp
jh|Mozilla Firefox\firefox.exe|https://ibsbjstar.ccb.com.cn/app/V5/CN/STY1/login.jsp
nh|Mozilla Firefox\firefox.exe|http://www.abchina.com/cn/wydl/grwydl/default.htm#
zh|Mozilla Firefox\firefox.exe|https://ebsnew.boc.cn/boc15/login.html

mydn|explorer|::{20D04FE0-3AEA-1069-A2D8-08002B30309D} ||||||我的电脑
hsz|explorer|::{645FF040-5081-101B-9F08-00AA002F954E} ||||||回收站
wslj|explorer|::{208D2C60-3AEA-1069-A2D7-08002B30309D} ||||||网上邻居
wllj|explorer|::{7007ACC7-3202-11D1-AAD2-00805FC1270E} ||||||网络连接
print|explorer|::{2227A280-3AEA-1069-A2DE-08002B30309D} ||||||打印机与传真
rwjh|explorer|::{D6277990-4C6A-11CF-8D87-00AA0060F5BF} ||||||任务计划

ie|C:\Program Files\Internet Explorer\IEXPLORE.EXE
hh|Mozilla Firefox\firefox.exe
Qvod|C:\Program Files\QvodPlayer\QvodPlayer.exe
Tu|C:\Program Files\Total Uninstall 6\Tu.exe
tc|C:\Program Files\Totalcmd\totalcmd.exe
GHK|E:\2013.12.8安装程序\系统热键GHotKeys全修改\GHotKeys.exe |||||||显示热键
kg|C:\Program Files\KuGou7\kugou7.exe
yd|E:\2013.12.8安装程序\12-有道翻译\Dict\YodaoDict.exe
ww|C:\Program Files\AliWangWang\AliIM.exe |||||||阿里旺旺
bdy|C:\Program Files\baidu\BaiduYunGuanjia\BaiduYunGuanjia.exe |||||||百度云
np++|C:\Program Files\Notepad++\notepad++.exe
dz|C:\Program Files\Kingsoft\TypeEasy\TypeEasy.exe |||||||金山打字通
NP|C:\WINDOWS\system32\notepad.exe;#include <_ini.au3>
#include <Array.au3>


$iFile = @ScriptDir & "\Config.ini"
$Section = 'FastStart'

;-----------------------------------------读取数据--读取正常--------------------------------------

Local $avArray = __IniReadToArray($iFile, $Section)
_ArrayDisplay($avArray, '读取配置文件')

Func __IniReadToArray($sIniFile, $Section, $idListview = 0, $sDecimal = '|')    ;本函数由afan老师特别编写。第三个参数 $idListview是自己加的。
                                  ;ini文件路径    ;字段名    列表视图ID;       ;分隔符
      Local $sIni = FileRead($sIniFile)
      Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1')
      $_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1')
      $sIni = StringRegExpReplace($sIni, '(?mi)[\s\S]*?^\h*\[' & $_Section & '\]\V*\v+([\s\S]+?)(?=\r\n\h*\[|\z)[\s\S]*', '\1')
      Local $aLine = StringRegExp($sIni, '\V+', 3)
      If @error Then Return SetError(1)
      Local $i, $afg, $j, $iMax = 1, $iC = 1
      Local $aData[$iMax]
      For $i = 0 To UBound($aLine) - 1
                If $idListview <> 0 Then GUICtrlCreateListViewItem($aLine[$i], $idListview)   ;这一行是自己加的,使一个函数两用:生成二维数组、填充listview列表视图
                $afg = StringSplit($aLine[$i], $sDecimal, 1)
                For $j = 1 To $afg
                        If $afg > $iMax Then
                              $iMax = $afg
                              ReDim $aData[$iMax]
                        EndIf
                        $aData[$i][$j - 1] = $afg[$j]
                Next
      Next
      ReDim $aData[$iMax]
      Return $aData
EndFunc   ;==>__IniReadToArray
       
       
;----------------------------------------- 添加一行 实验成功--------------------------------------------
;以下内容基本都是从afan老师_ini.au3函数里搬来的,进行拼凑。
$key = 'tjyh'
$Val = '新|添|加|的|一|行|---------------'
$mode = 0

Local $s_File = _FileRead($iFile)                                    ;用指定的FileOpen打开模式返回读取文件的字符串.

Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1')                     ;正则不懂,不知起什么作用
$_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1') ;正则不懂,不知起什么作用
$_Section = '\[\h*' & $_Section & '\h*\]'                                                    ;这句很重要,也不知起什么作用

;去$key、$_Val前后不可见字符吧
Local $_key = StringRegExpReplace($key, '^\h*(.+?)\h*, '$1')
$_key = StringRegExpReplace($_key, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
Local $_Val = StringRegExpReplace($Val, '^\h*(.+?)\h*, '$1')
$_Val = StringRegExpReplace($_Val, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')

;在某关键字下添加一行
$s_data = StringRegExpReplace(@CRLF & $s_File & @CRLF & '[', '(?si)(.*?\r?\n\h*' & $_Section & '.*?)((?:\r?\n)+)(\h*\[.*)', '$1' & @CRLF & $_key & '|' & $_Val & '$2$3')        ;131022修正*为+;将'='改为'|'可用。
Local $FO = FileOpen($iFile, $mode + 2)
$s_data = StringTrimLeft($s_data, 2)
$s_data = StringTrimRight($s_data, 3)
$Write = FileWrite($FO, $s_data)
FileClose($FO)
ShellExecute($iFile)


;-------------------------- 删除一行----利用_ini.au3中的_IniDelete_line有些能删有些不能删 ------------------------------
$key = 'zh'
_IniDelete_line($iFile, $Section, $key) ;, $flag = 0, $mode = 0)
MsgBox(0,0,'看看zh删了没有')
ShellExecute($iFile)

$key = 'sx'
_IniDelete_line($iFile, $Section, $key) ;, $flag = 0, $mode = 0)
MsgBox(0,0,'看看sx删了没有')
ShellExecute($iFile)

$key = 'print'
_IniDelete_line($iFile, $Section, $key) ;, $flag = 0, $mode = 0)
MsgBox(0,0,'看看gg删了没有')
ShellExecute($iFile)

;----------------------------------------- 修改一行 如何实现?---------------------------------------------------------

;例如将刚加一行"tjyh|新|添|加|的|一|行|---------------"修改为"tjyh|修|改|动|的|一|行|---------------"
$iFile = @ScriptDir & "\Config-1.ini"               ;配置文件
$Section = 'FastStart'                              ;字段名         
$key = 'tjyh'                                       ;关键字
$Val = "修|改|动|的|一|行|---------------"         ;新键值

Local $s_File = _FileRead($iFile)                                    ;用指定的FileOpen打开模式返回读取文件的字符串.

Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1')                                  ;正则不懂,不知起什么作用
$_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1')       ;正则不懂,不知起什么作用
$_Section = '\[\h*' & $_Section & '\h*\]'                                                               ;这句很重要,也不知起什么作用

;去$key、$_Val前后不可见字符吧
Local $_key = StringRegExpReplace($key, '^\h*(.+?)\h*, '$1')
$_key = StringRegExpReplace($_key, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
Local $_Val = StringRegExpReplace($Val, '^\h*(.+?)\h*, '$1')
$_Val = StringRegExpReplace($_Val, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')

$s_data = StringRegExpReplace('请教这里的正则该如何写呢?', '', '')
Local $FO = FileOpen($iFile, $mode + 2)
$s_data = StringTrimLeft($s_data, 2)
$s_data = StringTrimRight($s_data, 3)
$Write = FileWrite($FO, $s_data)
FileClose($FO)
ShellExecute($iFile)                                 ;看看修改后的结果






;----------------------------------- 以下是afan老师的函数 ------------------------------------


; 函数名:_FileRead;============================================================================
; 说明: 用FileOpen的打开模式返回读取文件的字符串
;==========================================================================================start
Func _FileRead($iFile, $mode = 0)
        Local $o_File = FileOpen($iFile, $mode)
        Local $s_File = String(FileRead($o_File))
        FileClose($o_File)
        Return $s_File
EndFunc   ;==>_FileRead

; 函数名:_IniReadSection_str;===================================================================
; 说明: 从(非)标准INI结构文件中读取某个字段(可选重复字段名)中的所有字符。
; 语法: _IniReadSection_str('ini文件路径', '字段名'[, 打开模式[, 重复标志]])
; 参数: 重复标志 - [可选],有些inf文件会有重复的字段名,设置此标志为1时可读取所有内容。
; 返回值:成功: 返回字段中的所有字符。
;    失败: 返回0。如INI文件读取错误或字段不存在将设置 @error=1;字段内容为空将设置 @error=2
;==========================================================================================start
Func _IniReadSection_str($iFile, $Section, $mode = 0, $nFlag = 0)
        Local $s_File = _FileRead($iFile, $mode), $line_all
        Local $_Section = StringRegExpReplace($Section, '^\h*|\h*, '')
      Local $s_Sec = StringRegExp($s_File, '(?si)(?:^|\n)\h*\[\h*\Q' & $_Section & '\E\h*\](.+?)(?=\r?\n\h*\[|$)', 3)
        If @error Then Return SetError(1, 0, 0)
        $line_all = $s_Sec
        If $nFlag Then
              For $i = 1 To UBound($s_Sec) - 1
                        $line_all &= $s_Sec[$i]
              Next
        Endif
        If Not StringRegExp($line_all, '\V') Then Return SetError(2, 0, 0)
        Return $line_all
EndFunc   ;==>_IniReadSection_str

; 函数名:_IniDelete_line;=============================================================================
; 说明: 从(非)标准INI结构文件中删除(含有)关键字的行。
; 语法: _IniDelete_line('ini文件路径', '字段名', '关键字'[, 匹配标志[, 打开模式]])
; 参数: 可选参数 匹配标志,= 0 含有要删除的关键字(默认); = 1 完整匹配关键字。
; 返回值:成功: 返回1。
;    失败: 返回0。并设置 @Error 为以下值:
;              @Error=1 文件或字段不存在;
;              @Error=3 根据匹配标志未匹配到关键字(不存在);
;              @Error=4 文件具有只读属性或者无法写入数据设置。
; 注意: 该函数仅执行一次删除行,如有多行(含有)关键字的行需要删除,可多次执行。
;==========================================================================================start
Func _IniDelete_line($iFile, $Section, $key, $flag = 0, $mode = 0)
        Local $s_File = _FileRead($iFile, $mode)
        Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1')
        $_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1')
        $_Section = '\[\h*' & $_Section & '\h*\]'
        If Not StringRegExp(@CRLF & $s_File, '\r?\n\h*' & $_Section & '\s*') Then Return SetError(1, 0, 0)
        Local $_key = StringRegExpReplace($key, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\=)', '\\$1')
        If $flag = 0 Then $_key = '[^\r?\n]*?' & $_key & '.*?'
        Local $s_data = StringRegExpReplace(@CRLF & $s_File & @CRLF, '(?si)(.*?\r?\n\h*' & $_Section & '\h*\r?\n(?:\h*[^\[\r\n]*\r?\n)*?)' & $_key & '\r?\n(.*)', '${1}$2')
        If @Extended = 0 Then Return SetError(3, 0, 0)
        $s_data = StringTrimRight(StringTrimLeft($s_data, 2), 2)
        Local $FO = FileOpen($iFile, $mode + 2)
        Local $Write = FileWrite($FO, $s_data)
        FileClose($FO)
        If $Write = 0 Then Return SetError(4, 0, 0)
        Return 1
EndFunc   ;==>_IniDelete_line
以上代码是根据afan老师的函数东拼西凑出来的,目前对以上格式配置文件的读取、添加一行已实现;但删除、修改一行还无法实现,在这儿求助各位老师、特别是afan老师的指点!

wangms 发表于 2014-7-30 22:56:49

自己顶一顶。。。。。。。。。。。。。。。。。

wangms 发表于 2014-7-31 09:30:04

另StringRegExpReplace ( "字符串", "表达式", "替换", [ 数量 = 0] )这个函数的参数 "替换",\0 - \9 (或 $0 - $9) 的逆向引用,帮助里说的很少,不知其含义及如何使用?本来正则就够复杂、再加这个不知何意的逆向引用,对这个很是有用的函数使用起来困难。

wangms 发表于 2014-7-31 16:15:24

本帖最后由 wangms 于 2014-7-31 16:17 编辑

本想用http://www.autoitx.com/forum.php?mod=viewthread&tid=11801&extra=&page=1      里的函数: _FileSRER2Line_替换(or删除)含有关键字的行(or空行) 进行删除某关键字,经测试也不理想,看来得等afan老师帮忙。

wangms 发表于 2014-8-2 19:20:31

静等afan老师出手。。。。。。。。。。。。。。。。。
页: [1]
查看完整版本: 求教非标Ini文件行删除修改操作