Board logo

标题: [文本处理] 批处理怎样修改BAT文件的某一个字符串? [打印本页]

作者: cj227329    时间: 2013-11-7 21:26     标题: 批处理怎样修改BAT文件的某一个字符串?

需要新写一个批处理实现: 修改一个文件夹(包括子文件夹)里所有 的 tiger.bat 文件,修改里面某一个字符串


tiger.bat 本身也是一个程序文件 ,内容如下
  1. @echo off
  2. ::注意tiger.bat不止一个,文件夹里很多,而且这里的tiger设置不一定相同,比如有的是set tiger=2m arm=0.4m
  3. set tiger=1m arm=0.5m
  4. set tiger=%tiger%head=0.1m
  5. set tiger=%tiger%mouth=0.01m
  6. set lion=0.9m arm=0.8m
  7. set lion=%lion%head=0.2m
复制代码
最后结果要是
  1. ::rem 只修改所有文件的第一行的tiger属性,全部改成3m,1m
  2. set tiger=3m arm=1m
  3. set tiger=%tiger%head=0.1m
  4. set tiger=%tiger%mouth=0.01m
  5. set lion=0.9m arm=0.8m
  6. set lion=%lion%head=0.2m
复制代码

作者: DAIC    时间: 2013-11-8 08:27

  1. @echo off
  2. for /r "C:\Test\" %%i in (*.bat) do (
  3.     if "%%i" neq "%~f0" (
  4.         sed -i "0,/^set tiger=/ s/set tiger=.*/set tiger=3m arm=1m/" "%%i"
  5.     )
  6. )
复制代码

作者: 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
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /s /b /a-d *.bat') do (
  3.     (echo,@echo off&echo,set tiger=3m arm=1m)>$
  4.     for /f "usebackq skip=2 delims=" %%j in ("%%i") do (echo,%%j>>$)
  5.     move $ "%%i"
  6. )
  7. 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
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /s /b /a-d *.bat') do (
  3.     set "flag="
  4.     for /f "usebackq delims=" %%j in ("%%i") do (
  5.         set str=%%j
  6.         if "!str:set tiger=!"=="%%j" (echo,%%j>>$) else (
  7.             if !flag! neq 1 (set flag=1&echo,set tiger=3m arm=1m>>$
  8.             ) else (echo,%%j>>$)
  9.         )
  10.     )
  11.     move $ %%i
  12. )
  13. pause
复制代码

作者: apang    时间: 2013-11-8 21:11

本帖最后由 apang 于 2013-11-11 11:41 编辑

学习powerbat的方法
  1. @set @n=0//&dir /a-d/b/s tiger.bat|cscript.exe -nologo -e:jscript "%~f0" &pause&exit/b
  2. while (!WSH.StdIn.AtEndOfStream) {
  3.     file = WSH.StdIn.ReadLine();
  4.     fso = new ActiveXObject("Scripting.FileSystemObject");
  5.     text = fso.OpenTextFile(file,1).ReadAll();
  6.     text = text.replace(/^( *set tiger)[^\r\n]+/im, "$1=3m arm=1m");
  7.     fso.OpenTextFile(file,2).Write(text);
  8.     fso = null;
  9. }
复制代码

作者: 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

  1. @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
复制代码
然后 里面 看下哦
  1. var file = WScript.Arguments(0);
  2. var str1 = WScript.Arguments(1);
  3. var str2 = WScript.Arguments(2);
  4. WScript.Echo(file + " " + str1 + " " + str2);
复制代码

作者: apang    时间: 2013-11-11 18:26

本帖最后由 apang 于 2013-11-11 18:32 编辑

把下面代码保存为test.bat
  1. @set @n=0//&dir /a-d/b/s "%~1"|cscript -nologo -e:jscript "%~f0" "%~2" "%~3" &pause&exit/b
  2. a = WScript.Arguments(0);
  3. b = WScript.Arguments(1);
  4. while (!WSH.StdIn.AtEndOfStream) {
  5.     file = WSH.StdIn.ReadLine();
  6.     fso = new ActiveXObject("Scripting.FileSystemObject");
  7.     re = new RegExp("^( *)" + a + "[^\\r\\n]+","im");
  8.     text = fso.OpenTextFile(file,1).ReadAll();
  9.     text = text.replace(re, "$1" + b);
  10.     fso.OpenTextFile(file,2).Write(text);
  11.     fso = null;
  12.     re = null;
  13. }
复制代码
然后:
  1. test.bat "tiger.bat" "set tiger" "set tiger=3m arm=1m"
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2