标题: [文本处理] 批处理怎样修改BAT文件的某一个字符串? [打印本页]
作者: cj227329 时间: 2013-11-7 21:26 标题: 批处理怎样修改BAT文件的某一个字符串?
需要新写一个批处理实现: 修改一个文件夹(包括子文件夹)里所有 的 tiger.bat 文件,修改里面某一个字符串
tiger.bat 本身也是一个程序文件 ,内容如下- @echo off
- ::注意tiger.bat不止一个,文件夹里很多,而且这里的tiger设置不一定相同,比如有的是set tiger=2m arm=0.4m
- set tiger=1m arm=0.5m
- set tiger=%tiger%head=0.1m
- set tiger=%tiger%mouth=0.01m
- set lion=0.9m arm=0.8m
- set lion=%lion%head=0.2m
复制代码
最后结果要是- ::rem 只修改所有文件的第一行的tiger属性,全部改成3m,1m
- set tiger=3m arm=1m
- set tiger=%tiger%head=0.1m
- set tiger=%tiger%mouth=0.01m
- set lion=0.9m arm=0.8m
- set lion=%lion%head=0.2m
复制代码
作者: DAIC 时间: 2013-11-8 08:27
- @echo off
- for /r "C:\Test\" %%i in (*.bat) do (
- if "%%i" neq "%~f0" (
- sed -i "0,/^set tiger=/ s/set tiger=.*/set tiger=3m arm=1m/" "%%i"
- )
- )
复制代码
作者: cj227329 时间: 2013-11-8 14:30
不能用sed吧。。我这调不通
'sed' 不是内部或外部命令,也不是可运行的程序
作者: DAIC 时间: 2013-11-8 14:36
回复 3# cj227329
下载一个吧
http://code.google.com/p/gnu-on-windows/downloads/list
作者: cj227329 时间: 2013-11-8 15:24
我这个程序写出来不止在我环境下运行,是要在很多电脑上跑,不可能要求他们都去下载,所以,只能用批处理的原始语句解决,
作者: DAIC 时间: 2013-11-8 15:29
回复 5# cj227329
你下载好,跟bat文件一起打包发给他们。
作者: foxJL 时间: 2013-11-8 15:51
要修改的内容都是在第二行?
也就是第一行@echo off下面的一行?
有没有什么特殊情况?
作者: foxJL 时间: 2013-11-8 16:07
本帖最后由 foxJL 于 2013-11-8 16:09 编辑
如果是我7楼说的这种情况试试这个代码,不用第三方
避免修改自身,要把这个脚本扩展名改为.cmd- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s /b /a-d *.bat') do (
- (echo,@echo off&echo,set tiger=3m arm=1m)>$
- for /f "usebackq skip=2 delims=" %%j in ("%%i") do (echo,%%j>>$)
- move $ "%%i"
- )
- pause
复制代码
作者: cj227329 时间: 2013-11-8 16:29
中间可能有空行,但是一定是set tiger = 开头的第一行。不能通过行数来确定修改。 我的思路是判断以 set tiger = 开头的,第一行修改,之后的不修改。。。 可总写不对。。。调出来结果总是错的
@echo off
set flag=true
(for /f "delims=" %%a in (tiger.bat) do (
for /f "delims==" %%b in ("%%a") do (
if flag==false (
echo;%%a
) else (
if "%%b"=="set tiger" (
set flag=false
echo set tiger=3m arm=1m
) else echo;%%a
)
)
))>tmp.txt
作者: cj227329 时间: 2013-11-8 16:53
8楼的代码调了下。。末有修改。。。
作者: DAIC 时间: 2013-11-8 16:55
回复 9# cj227329
第5行的字符串 flag 永远不可能等于字符串 false
作者: cj227329 时间: 2013-11-8 17:00
回复 11# DAIC
应该怎么写?我现在这样写,测试出来,就是把所有的set tiger= 开头的都改了。。。
作者: foxJL 时间: 2013-11-8 17:27
避免修改自身,要把这个脚本扩展名改为.cmd- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s /b /a-d *.bat') do (
- set "flag="
- for /f "usebackq delims=" %%j in ("%%i") do (
- set str=%%j
- if "!str:set tiger=!"=="%%j" (echo,%%j>>$) else (
- if !flag! neq 1 (set flag=1&echo,set tiger=3m arm=1m>>$
- ) else (echo,%%j>>$)
- )
- )
- move $ %%i
- )
- pause
复制代码
作者: apang 时间: 2013-11-8 21:11
本帖最后由 apang 于 2013-11-11 11:41 编辑
学习powerbat的方法- @set @n=0//&dir /a-d/b/s tiger.bat|cscript.exe -nologo -e:jscript "%~f0" &pause&exit/b
- while (!WSH.StdIn.AtEndOfStream) {
- file = WSH.StdIn.ReadLine();
- fso = new ActiveXObject("Scripting.FileSystemObject");
- text = fso.OpenTextFile(file,1).ReadAll();
- text = text.replace(/^( *set tiger)[^\r\n]+/im, "$1=3m arm=1m");
- fso.OpenTextFile(file,2).Write(text);
- fso = null;
- }
复制代码
作者: cj227329 时间: 2013-11-11 10:42
感谢各位
13楼版主的代码俺总是调不通
14 楼的可以实现需求。。。再问下 这个对环境有什么要求么。。。
作者: cj227329 时间: 2013-11-11 11:40
@set @n=0//&dir /a-d/b/s tiger.bat|cscript.exe -nologo -e:jscript "%~f0" &pause&exit/b
while (!WSH.StdIn.AtEndOfStream) {
file = WSH.StdIn.ReadLine();
fso = new ActiveXObject("Scripting.FileSystemObject");
text = fso.OpenTextFile(file,1).ReadAll();
text = text.replace(/^ *set tiger[^\r\n]+/m, "set tiger=3m arm=1m");
fso.OpenTextFile(file,2).Write(text);
fso = null;
}
我想把要修改的文件名称 和修改前后的值设置为参数 传入,该怎么写,大神教下?
tiger.bat
set tiger
set tiger=3m arm=1m 这3个
作者: terse 时间: 2013-11-11 14:14
- @set @n=0//&dir /a-d/b/s tiger.bat|cscript.exe -nologo -e:jscript "%~f0" "tiger.bat" "set tiger" "set tiger=3m arm=1m" &pause&exit/b
复制代码
然后 里面 看下哦- var file = WScript.Arguments(0);
- var str1 = WScript.Arguments(1);
- var str2 = WScript.Arguments(2);
- WScript.Echo(file + " " + str1 + " " + str2);
复制代码
作者: apang 时间: 2013-11-11 18:26
本帖最后由 apang 于 2013-11-11 18:32 编辑
把下面代码保存为test.bat- @set @n=0//&dir /a-d/b/s "%~1"|cscript -nologo -e:jscript "%~f0" "%~2" "%~3" &pause&exit/b
- a = WScript.Arguments(0);
- b = WScript.Arguments(1);
- while (!WSH.StdIn.AtEndOfStream) {
- file = WSH.StdIn.ReadLine();
- fso = new ActiveXObject("Scripting.FileSystemObject");
- re = new RegExp("^( *)" + a + "[^\\r\\n]+","im");
- text = fso.OpenTextFile(file,1).ReadAll();
- text = text.replace(re, "$1" + b);
- fso.OpenTextFile(file,2).Write(text);
- fso = null;
- re = null;
- }
复制代码
然后:- test.bat "tiger.bat" "set tiger" "set tiger=3m arm=1m"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |