标题: [文件操作] 批处理如何实现修改.h文件中的指定行内容? [打印本页]
作者: swang21 时间: 2016-4-26 16:32 标题: 批处理如何实现修改.h文件中的指定行内容?
本帖最后由 pcl_test 于 2016-4-26 19:46 编辑
有config.h文件,其中有几句话如下:
/************SERVICE SS configuration************/
//#define RADIO_IP31 /* IP31 radio */
#define RADIO_SK81 /* SK81 radio */
#define RADIO_LAM /* LAM radio */
#define RADIO_SUPPORT_OV_DTC /* radio support OV DTC*/
#define RADIO_LAM_2DIN /* LAM radio */
想写脚本先判断如下两句
//#define RADIO_IP31 /* IP31 radio */
#define RADIO_SK81 /* SK81 radio */
如果是屏蔽了第一句,使用第二句,就改为:
#define RADIO_IP31 /* IP31 radio */
//#define RADIO_SK81 /* SK81 radio */
使用第一句,屏蔽第二句。
请教大家,谢谢!
作者: Nsqs 时间: 2016-4-26 17:33
本帖最后由 Nsqs 于 2016-4-28 01:05 编辑
- dim fso,Wsc,WshPath,s(1),check(1)
- set fso=CreateObject("scripting.filesystemobject")
- Set Wsc=CreateObject("wscript.shell")
- WshPath=Fso.getparentfoldername(wsh.scriptfullname):Wsc.CurrentDirectory = WshPath
- file="2.txt"
- if not fso.fileexists(file) then wsh.quit
- sample="new_"&file
- if not fso.fileexists(sample) then fso.copyfile file,sample
- result=fso.opentextfile(sample).readall
- '正在处理,可能需要点时间...
- t=timer
- s(0)="//#define RADIO_IP31 /* IP31 radio */":s(1)="//#define RADIO_SK81 /* SK81 radio */"
- check(0)=instr(result,s(0))>0:check(1)=instr(result,s(1))>0
- if check(0)=-1 then _
- result=Replace(result,s(0),right(s(0),len(s(0))-2)):_
- result=Replace(result,right(s(1),len(s(1))-2),s(1)):_
- write
- if check(1)=-1 then _
- result=Replace(result,right(s(0),len(s(0))-2),s(0)):_
- result=Replace(result,s(1),right(s(1),len(s(1))-2)):_
- write
- sub write
- fso.createtextfile(sample).write result
- set fso=nothing
- msgbox Round(timer-t,2) & "秒完成!",64
- wsh.quit
- end sub
复制代码
保存vbs代码
作者: /zhqsystem/zhq 时间: 2016-4-26 20:21
回复 1# swang21
- @echo off&(color 0e&chcp 936&setlocal enabledelayedexpansion)2>nul
- for /f "delims=" %%i in ('type "%~f1"')do (
- if /i "%%i"=="//#define RADIO_IP31 /* IP31 radio */" (set "if_one=1"
- )else if /i "%%i"=="#define RADIO_SK81 /* SK81 radio */" (set "if_two=1"
- )
- )
- echo,%if_one%%if_two%
- if /i "%if_one%%if_two%"=="11" (cd.>"%~f1.%~x1")
- if /i "%if_one%%if_two%"=="11" (
- for /f "delims=" %%i in ('type "%~f1"')do (
- if /i "%%i"=="//#define RADIO_IP31 /* IP31 radio */" (
- rem:
- )else if /i "%%i"=="#define RADIO_SK81 /* SK81 radio */" (
- (echo,%%i)>>"%~f1.%~x1"
- )else (
- (echo,%%i)>>"%~f1.%~x1"
- )
- )
- )
- pause
复制代码
作者: codegay 时间: 2016-4-26 22:52
太讽刺了。
作者: swang21 时间: 2016-4-27 14:59
回复 3# /zhqsystem/zhq
谢谢你的指教,还有点问题请教你一下:
1. %~f1.%~x1 这是什么意思啊?
2. 脚本应该首先读config.h文件,再找到那两行进行后续的修改吧?
作者: swang21 时间: 2016-4-27 15:01
回复 4# codegay
敢问为什么讽刺吗?
这个帖子的问题太简单?
作者: swang21 时间: 2016-4-27 15:04
回复 2# Nsqs
谢谢你的指教,您的代码我没看太明白,是不是大致意思是:遍历文件发现“//”就改掉,如果是这个思路有可能不太行,因为config.h文件中有多处以“//”开头的语句。
作者: Nsqs 时间: 2016-4-27 15:42
回复 7# swang21
可能我没看懂你的问题,思路是遇到//后就切换上下行文本,只处理第一次遇到的//
作者: happy886rr 时间: 2016-4-27 15:48
本帖最后由 happy886rr 于 2016-4-27 15:51 编辑
回复 7# swang21
第三方fr地址- @echo off
- fr config.h -r:"^ *// *#define RADIO_IP31 /\* IP31 radio \*/" -t:"#define RADIO_IP31 /\* IP31 radio \*/"
- fr config.h -r:"^ *#define RADIO_SK81 /\* SK81 radio \*/" -t:"//#define RADIO_SK81 /* SK81 radio */"
- set/p=完成
复制代码
作者: codegay 时间: 2016-4-27 15:49
回复 7# swang21
你能看懂别人代码的逻辑,也能知道处理的逻辑流程。对你来说显然是简单的。
作者: swang21 时间: 2016-4-27 16:34
回复 9# happy886rr
经过测试,是可以使用的,但是为什么执行的这么慢呢,得1分钟。
作者: swang21 时间: 2016-4-27 16:35
回复 8# Nsqs
那我再按照你的思路理解一下,有问题再请教你。
作者: happy886rr 时间: 2016-4-27 16:45
本帖最后由 happy886rr 于 2016-4-27 16:52 编辑
回复 11# swang21
替换200万行也不需要3秒,这是白杨的fr,不会慢的,除非你的系统缺少了必要的dll支持,我这都测试了20万行的头文件,替换0.3秒左右。由于论坛空间有限,截图就不上了,我又测试了替换500万行,也才8秒。毕竟是C语言只比汇编语言慢20%,但是却比任何其他高级语言都快,除非你用凌动系列cpu。
作者: swang21 时间: 2016-4-27 17:15
回复 13# happy886rr
那怎么回事呢,我的头文件也就几百行,有可能怪我的电脑吧。
fr.exe直接放在和脚本同一路径就行了吧,不需要设置环境变量吧?
作者: happy886rr 时间: 2016-4-27 18:05
回复 14# swang21
如果是最新win10系统,可能会出现不兼容。你啥系统?
作者: pcl_test 时间: 2016-4-27 23:59
本帖最后由 pcl_test 于 2016-4-28 00:29 编辑
- //&cls&cscript -nologo -e:jscript "%~f0"<"config.h"&pause&exit
- var txt = WSH.StdIn.ReadAll().replace(/\/\/(#define RADIO_IP31 \/\* IP31 radio \*\/)/, '$1');
- WSH.echo(txt.replace(/\/*(#define RADIO_SK81 \/\* SK81 radio \*\/)/, '//$1'));
复制代码
作者: /zhqsystem/zhq 时间: 2016-4-28 00:29
回复 5# swang21
%~f1是拖拽全路径,取%~x1是我为了简写后缀%~x1是取值拖拽的后缀例如.txt
详见命令行
for /?
扩展说明
作者: Nsqs 时间: 2016-4-28 01:04
回复 1# swang21
看1L更新帖 500万行,实测,10秒内完成
作者: swang21 时间: 2016-4-28 09:15
回复 15# happy886rr
win 7 professional
作者: happy886rr 时间: 2016-4-28 09:23
回复 19# swang21
fr官网http://baiy.cn/utils/fr/index.htm,下载最新版试试。
作者: swang21 时间: 2016-5-3 09:14
回复 3# /zhqsystem/zhq
你好,您的代码中的第8句:if /i "%if_one%%if_two%"=="11" (cd.>"%~f1.%~x1")
运行后文件首先被清除,所以下面的操作都找不到对象;
我把这句屏蔽之后可以操作,但是操作后的内容会顺次粘贴在源文件之后。
怎么破呢
作者: /zhqsystem/zhq 时间: 2016-5-3 19:11
本帖最后由 /zhqsystem/zhq 于 2016-5-3 19:13 编辑
回复 21# swang21
这句是判断这两个值的如果存在则清理原始文件内容,防止直接追加
如果不存在,追加没有必要性可以加入直接退出代码
有一条存在就是1,两个存在就是1和1的组合
11
存在一条不会去清理所以可以加入退出代码也就是不满足条件
if /i "%if_one%%if_two%"=="11" (cd.>"%~f1.%~x1"
)else (
goto :eof||exit
)
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |