找回密码
 加入
搜索
查看: 4633|回复: 11

[AU3基础] 删除特殊的文件行该如何处理?[已解决]

  [复制链接]
发表于 2013-2-21 15:34:19 | 显示全部楼层 |阅读模式
本帖最后由 chishingchan 于 2013-2-23 22:14 编辑

以下是某软件的一个XML文件:
<?xml version="1.0" encoding="utf-8"?>
<Window>
  <Font name="微软雅黑" size="12" bold="false" default="true" />
  <Font name="微软雅黑" size="12" bold="true"/>
  <Default name="Menu" value="inset="1,0,1,0" itemtextpadding="20,0,0,0" bkimage="file='menu_bk.png'" itemselectedimage="file='uiitem.png' source='0,59,126,89'" itemselectedtextcolor="0xFFFFFFFF"" />
  <Default name="MenuElement" value="padding="0,0,0,0"" />
  <Default name="Normal_helpIcon" value="bkimage="file='uiitem.png' source='44,15,50,21' dest='94,10,100,16'"" />
  <Default name="Selected_helpIcon" value="bkimage="file='uiitem.png' source='38,15,44,21' dest='94,10,100,16'"" />
  <Menu>
    <MenuElement name="menu_launch" text="开机自动运行">
      <HorizontalLayout>
        <Option name ="launch_status"selectedimage="file='uiitem.png' source='0,15,14,25' dest='1,6,15,16'" />
      </HorizontalLayout>
    </MenuElement>
    <MenuElement name="menu_mini2tip" text="最小化到托盘" />
    <MenuElement name="menu_setting" text="设置...">
      <Label width="20" bkimage="file='uiitem.png' source='14,15,28,29' dest='0,6,14,20'" />
    </MenuElement>
    <MenuElement name="menu_shutdown" text="定时关机..." />
    <MenuElement name="menu_help_element" text="帮助">
      <Label name="menu_help_icon" width="6" bkimage="file='uiitem.png' source='44,15,50,21' dest='94,10,100,16'"/>
      <MenuElement name="menu_help" padding="0,0,0,0" text="帮助"/>
      <MenuElement name="menu_official" padding="0,0,0,0" text="官方网站" />
      <MenuElement name="menu_homepage" padding="0,0,0,0" text="首页" />
      <MenuElement name="menu_feedback" padding="0,0,0,0" text="提交反馈" />
      <MenuElement name="menu_about" padding="0,0,0,0" text="关于" />
    </MenuElement>
    <MenuElement name="menu_exit" text="退出" >
      <Label width="20" bkimage="file='uiitem.png' source='28,15,38,26' dest='1,6,11,17'" />
    </MenuElement>
  </Menu>
</Window>
需要做如何操作:
删除行:10、11、12、13、14;22、23、24、25、26
修改行:20    "帮助" 改为 "关于"

借用了 Afan超版 制作的两个函数
_FileSRER2Line
_StringREReplace_Order
$File = "menu.xml"
_FileSRER2Line($File,'menu_launch','',0)
_FileSRER2Line($File,'HorizontalLayout','',0)
_FileSRER2Line($File,'launch_status','',0)
_FileSRER2Line($File,‘</MenuElement>','',0)
因为“</MenuElement>”有多个,_FileSRER2Line 解决不了了!经 Afan 指点使用 _StringREReplace_Order,但好像用在这不合适?!
语法: _StringREReplace_Order('字符串', '搜索字符'[, '替换'[, 出现次序[, 区分大小写[, 正则标志]]]])

请问高手们该如何解决此问题?!
发表于 2013-2-21 16:11:36 | 显示全部楼层
本帖最后由 happytc 于 2013-2-21 16:43 编辑

回复 1# chishingchan


  

#include <array.au3>
#include <File.au3>
Local $aArray, $aLine[10] = [10, 11, 12, 13, 14, 22, 23, 24, 25, 26]
_FileReadToArray('a.txt', $aArray)
$aArray[20] = StringRegExpReplace($aArray[20], '帮助', '关于')
For $i = 0 To UBound($aLine) - 1
        _ArrayDelete($aArray, $aLine[$i] - $i)
Next
_ArrayDelete($aArray, 0)
_FileWriteFromArray('a.txt', $aArray, @CRLF)

评分

参与人数 1金钱 +30 收起 理由
chishingchan + 30 谢谢!

查看全部评分

 楼主| 发表于 2013-2-21 18:09:44 | 显示全部楼层
回复 2# happytc


    谢谢!不过好像运行出错了。我正在检查。。。
 楼主| 发表于 2013-2-21 18:13:47 | 显示全部楼层
这个脚本用在《软件安装器》里面的,如果不需要#include语句就最好了!
发表于 2013-2-21 18:25:24 | 显示全部楼层
本帖最后由 afan 于 2013-2-21 18:27 编辑
#Include <Array.au3>

_FileDelLine('test.txt', '10、11、12、13、14;22、23、24、25、26', 'test111.txt')

Func _FileDelLine($File, $sLine, $FileNew = '', $CR = 1)
        ;afan说明: 本函数可按指定的行号删除行,可指定多个行号:非数字字符间隔即可。
        ;语法:  _FileDelLine('文件路径', '行号'[, '新文件名'[, 回车符标志]])
        ;参数:  可选参数:如'新文件名'字符为空则写入原文件(默认);不为空则写入指定的文件。
        ;     可选参数:回车符标志 = 1 仅识别有回车符的断行@CRLF(默认),非1只要有换行符@LF即识别为断行
        ;另注:  使用本函数需 #Include <Array.au3>(仅为了规避重复行号及行号乱序,如无需求可注释掉)

        Local $aLine = StringRegExp($sLine, '\d+', 3)
        If @Error Then Return SetError(1)
        $aLine = _ArrayUnique($aLine)        ;---- 规避重复行号
        _ArraySort($aLine, 1, 1)                ;---- 规避行号乱序
        Local $str = String(FileRead($File)), $i, $CRF = ''
        If $CR <> 1 Then $CRF = '?'
        For $i = 1 To UBound($aLine) - 1
                $str = StringRegExpReplace($str, '(^(?:.*?\r' & $CRF & '\n){' & Number($aLine[$i]) - 1 & '})\V*\r' & $CRF & '\n?', '$1')
        Next
        Local $_File = $File, $FO
        If $FileNew <> '' Then $_File = $FileNew
        $FO = FileOpen($_File, 2 + 8)
        FileWrite($FO, $str)
        FileClose($FO)
EndFunc   ;==>_FileDelLine

评分

参与人数 1金钱 +30 收起 理由
chishingchan + 30 谢谢!

查看全部评分

发表于 2013-2-21 18:56:48 | 显示全部楼层
这个脚本用在《软件安装器》里面的,如果不需要#include语句就最好了!
chishingchan 发表于 2013-2-21 18:13


搞不明白什么意思? 为什么用在这里面,就“#include语句”不好了?
谢谢!不过好像运行出错了。我正在检查。。。


你把上面你给的文本存为a.txt文件(注意看看用记事本打开是32行),放在脚本所在目录,若出错,给出错误信息。
 楼主| 发表于 2013-2-21 21:33:40 | 显示全部楼层
回复 6# happytc


    因为脚本不需要编译,与 AutoIt3.exe 单文件同目录,直接命令行调用,如果包含文件,此目录就会多了包含的文件。
 楼主| 发表于 2013-2-21 21:37:07 | 显示全部楼层
回复 6# happytc


    因为脚本不需要编译,与 AutoIt3.exe 单文件同目录,直接命令行调用,如果包含文件,此目录就会多了包含的文件。

第7行的-号出错
发表于 2013-2-21 22:15:15 | 显示全部楼层
回复  happytc


    因为脚本不需要编译,与 AutoIt3.exe 单文件同目录,直接命令行调用,如果包含文件 ...
chishingchan 发表于 2013-2-21 21:37



    那个肯定是错了,将“-”改成“-”
发表于 2013-2-21 22:34:16 | 显示全部楼层
回复 8# chishingchan


    直接写的,没想到输入法问题,把减号输入成全角的。哈………………
那是个减号:-

“ 因为脚本不需要编译,与 AutoIt3.exe 单文件同目录,直接命令行调用,如果包含文件,此目录就会多了包含的文件。”

这个嘛,最简单就是利用‘迷惑',可以把所有的Include文件和你的脚本一起放在一个文件里。当然,你手工把那象_ArrayDelete等函数的定义直接拷到你的脚本文件里也可以,那几个函数定义都是独立的。
发表于 2013-2-21 22:36:25 | 显示全部楼层
其实这个错误,不是一眼就可以看出来嘛。
 楼主| 发表于 2013-2-22 12:27:29 | 显示全部楼层
其实这个错误,不是一眼就可以看出来嘛。
happytc 发表于 2013-2-21 22:36



    这个是,还有一个错误是我改文件名字时改少一个错误的。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 16:21 , Processed in 0.096278 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表