[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何修改文本内容?

各位高手大家好 我现在有一个棘手的批处理问题先具体说明下希望大家能帮助下我:

现在有一个总文件夹(名字暂且叫123吧)里面有50个子文件夹(名字各不一样)和一个名为“cp.gs”文本文档,每个子文件夹下面又有一个“xxxx.ctl”的文本文档(每个子文件夹下的这个ctl名字不一样,比如第一个叫chen,第二个可能就是叫chenp。。。)。chen.ctl里的内容为:
dset d:\chenp\fnl_2010%m2%d2_%h2_00_c
options template   
index d:\chenp\1.idx
undef 9.999E+20
title d:\chenp\fnl_2010%m2%d2_%h2_00_c
*  produced by grib2ctl v0.9.12.5p39c
dtype grib 3
options yrev
ydef 181 linear -90.000000 1
xdef 360 linear 0.000000 1.000000
tdef 6 linear 12Z05May2010 6hr
。。。。
。。。。
-------------------------------------------------------------------------------------------------
cp.gs里内容为:
'reinit'
'open d:\chenp\xxxx.ctl'
'set parea 1 10 1 7.5'
'set xlopts 1 4 0.1'
'set ylopts 1 4 0.1'
i=1
while(i<=6)
。。。。
。。。。
'printim d:\chenp\700h_'time'.png white'
--------------------------------------------------------------------------------------------------------------------

我想通过批处理实现:
1:将gs中的'open d:\chenp\chen.ctl'的xxxx.ctl名字改为每个子文件夹下的ctl的名字;
2:将gs中while(i<=6)中6这个数字改为ctl中tdef 6 linear 12Z05May2010 6hr中tdef 后面这个数字,这个数字不一定是6
3:将'printim d:\chenp\700h_'time'.png  white'中的路径改为子文件夹的路径
4:上述改完保存改好的xxx.gs后再运行总文件夹下的这个gs,用以下语句:grads -blc "d:\总文件夹\xxx.gs"
以上为一个循环的内容,一共循环50次,注意:每个子文件夹的文件名及其里面的ctl的文件名都不一样。
恳请给位高手帮忙。谢谢啦。

是不是 有50个xxx.gs
如果是 那就是要修改子文件夹里的 xxx.gs 吗?

TOP

有50个文件夹 但是只有一个gs,都在一个总的文件夹下面 每次循环只修改gs  运行

TOP

回复 2# terse

有50个文件夹 但是只有一个gs,都在一个总的文件夹下面 每次循环只修改gs  运行

TOP

楼主最好把一楼的内容排版好了再说,否则看着别扭不明就里。注意分行、序号整理好。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 5# cjiabing


    好的

TOP

1:将gs中的'open d:\chenp\cccc.ctl'的cccc.ctl名字改为每个文件夹下的xxxx.ctl的名字;
——————你上面有说都有一个名字为xxxx.ctl的文件,现在又说改名字,名字都一样改什么?

3:将'printim d:\chenp\700h_'time'.png  white'中的路径改为子文件夹的文件名
——————改为子文件夹的文件名比如改成:新建文件夹\700h_'time'.png?????

4:上述改完保存改好的xxx.gs后再运行总文件夹下的这个gs,用以下语句:grads -blc "d:\总文件夹\xxx.gs"
——————这个你自己会吧????

以上为一个循环的内容,一共循环50次,注意:每个子文件夹的文件名及其里面的ctl的文件名都不一样。
——————原来是不一样!~只有一个????
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /r %%a in (*.ctl) do (
  3.     for /f "usebackq tokens=1,2" %%x in ("%%~a") do if /i "%%x"=="tdef" set "str=%%y"
  4.     for /f "tokens=*" %%i in (xxx.gs) do (
  5.         set "var=%%i"
  6.         if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:\cccc.ctl=\%%~na.ctl!
  7.         if "%%i"=="while(i<=6)" set "var=while(i<=!str!)"
  8.         for /d  %%l in (*) do set var=!var:d:\chenp\700h_=%%~nl\700h_!
  9.         echo;!var!
  10.     )
  11. )&echo;&echo;
  12. pause
复制代码
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 7# cjiabing

cjiabing:您好
我将原来的要求内容改了下 麻烦您看下。
将'printim d:\chenp\700h_'time'.png  white'中的路径改为子文件夹的文件名----这个我写错了应该是改为当前这个子文件夹的路劲。
上述改完保存改好的xxx.gs后再运行总文件夹下的这个gs,用以下语句:grads -blc "d:\总文件夹\xxx.gs"---这个我不知道将它加再循环的那个部分 因为没一次修改后的gs都要运行一遍

以上为一个循环的内容,一共循环50次,注意:每个子文件夹的文件名及其里面的ctl的文件名都不一样。-----一共有50个子文件夹和50个ctl,每个文件夹下一个ctl,实际上'open d:\chenp\cccc.ctl'的cccc.ctl‘这个是读取每个子文件夹下的ctl。

TOP

回复 9# cpp


   
  1. @echo off&setlocal enabledelayedexpansion
  2. for /r %%a in (*.ctl) do (
  3. for /f "usebackq tokens=1,2" %%x in ("%%~a") do if /i "%%x"=="tdef" set "str=%%y"
  4. for /f "tokens=*" %%i in (xxx.gs) do (
  5. set "var=%%i"
  6. if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:\cccc.ctl=\%%~na.ctl!
  7. if "%%i"=="while(i<=6)" set "var=while(i<=!str!)"
  8. for /d %%l in ("%%~dpa") do set "var=!var:d:\chenp\700h_=%%~fl700h_!"
  9. echo;!var!
  10. )>>new_xxx.gs
  11. pause
  12. echo grads -blc "%~dp1new_xxx.gs"
  13. del /f new_xxx.gs>nul 2>nul
  14. )
  15. pause
复制代码

注意:
1、第一个pause是为了你检查内容修改是否正确,使用时去掉即可。
2、把 echo grads -blc "%~dp1new_xxx.gs" 中的 echo 去掉就可以执行你的grads了。
3、只针对你提问的进行修改,使用时需要根据实际情况修改替换的值以及路径。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

批处理修改文本内容--在线等

本帖最后由 cpp 于 2012-3-18 19:54 编辑

各位高手大家好 我现在有一个棘手的批处理问题先具体说明下希望大家能帮助下我:

现在有一个总文件夹(暂且命名为123)里面有50个子文件夹和一个名为“xxx.gs”文本文档,每个子文件夹下面又有一个名为“xxxx.ctl”的文本文档。
xxxx.ctl里的内容为:
dset d:\chenp\fnl_2010%m2%d2_%h2_00_c
options template   
index d:\chenp\1.idx
undef 9.999E+20
title d:\chenp\fnl_2010%m2%d2_%h2_00_c
*  produced by grib2ctl v0.9.12.5p39c
dtype grib 3
options yrev
ydef 181 linear -90.000000 1
xdef 360 linear 0.000000 1.000000
tdef 6 linear 12Z05May2010 6hr
。。。。
。。。。
-------------------------------------------------------------------------------------------------
xxx.gs里内容为:
'reinit'
'open d:\chenp\cccc.ctl'

'set parea 1 10 1 7.5'
'set xlopts 1 4 0.1'
'set ylopts 1 4 0.1'
i=1
while(i<=6)
。。。。
。。。。
'printim d:\chenp\700h_'time'.png white'
--------------------------------------------------------------------------------------------------------------------

我想通过批处理实现:
1:将gs中的'open d:\chenp\cccc.ctl'的cccc.ctl名字改为每个子文件夹下的xxxx.ctl的名字; open实际上是读取某个子文件夹下的ctl文件,一共有50个文件夹就有50个ctl,每个的名字都不一样。
2:将gs中while(i<=6)中6这个数字改为ctl中tdef 6 linear 12Z05May2010 6hr中tdef 后面这个数字,这个数字不一定是6
3:将'printim d:\chenp\700h_'time'.png  white'中的路径改为子文件夹的路径
4:上述改完保存改好的xxx.gs后再运行总文件夹下的这个gs,用以下语句:grads -blc "d:\总文件夹\xxx.gs"
以上为一个循环的内容,一共循环50次,每个文件夹的名字以及ctl的名字都不一样。
恳请给位高手帮忙。谢谢啦。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /r %%a in (*.ctl) do (
  3.     for /f "usebackq tokens=1,2" %%x in ("%%~a") do if /i "%%x"=="tdef" set "str=%%y"
  4.     for /f "tokens=*" %%i in (xxx.gs) do (
  5.         set "var=%%i"
  6.         if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:\cccc.ctl=\%%~na.ctl!
  7.         if "%%i"=="while(i<=6)" set "var=while(i<=!str!)"
  8.         for /d  %%l in ("%%~dpa") do  set "var=!var:d:\chenp\700h_=%%~fl700h_!"
  9.         echo;!var!
  10.     )>>new_xxx.gs
  11. pause
  12.     echo grads -blc "%~dp1new_xxx.gs"
  13.     del /f new_xxx.gs>nul 2>nul
  14. )
  15. pause
复制代码
说明:
1、你的意思是根据条件修改gs文件,害我想了许久。
2、第一个pause用来检查替换结果,你使用时去掉即可。
3、把 echo grads -blc "%~dp1new_xxx.gs" 前面的 echo 删掉即可运行。
4、有些目录和替换内容可能需要修改,请按实际情况修改。
2

评分人数

    • cpp: 乐于助人技术 + 1
    • CrLf: 乐于助人技术 + 1
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

  1. @set @n=0/*& echo off
  2. set "folder=d:\总文件夹"
  3. copy /y xxx.gs xxx.gs.bak
  4. cscript.exe -e:jscript "%~f0" "%folder%" || (pause&exit/b)
  5. echo grads -blc "%folder%\xxx.gs"
  6. rem do something you like.
  7. exit/b
  8. */
  9. folder = WScript.Arguments(0);
  10. file = folder + "\\xxx.gs";
  11. strQuery = "select name from CIM_DataFile where "
  12.     + " drive='" + folder.substr(0,2) + "' and "
  13.     + " path like '" + folder.substr(2).replace(/\\/g,'\\\\') + "\\\\%'"
  14.     + " and extension='ctl'";
  15. wmi = new ActiveXObject("WbemScripting.SWbemLocator").ConnectServer();
  16. colFiles = wmi.ExecQuery(strQuery, "WQL", 48);
  17. e = new Enumerator(colFiles);
  18. arrFiles = [];
  19. for (; !e.atEnd(); e.moveNext())  arrFiles.push(e.item().name);
  20. txt = readtext(file);
  21. i = 0;
  22. txt = txt.replace(/^'open ([^']+)|^while\(i<=(\d+)\)/gm,
  23.   function(s0,s1,s2){
  24.     if (s1) return s0.replace(s1, arrFiles[i]);
  25.     else return s0.replace(s2,
  26.         readtext(arrFiles[i++]).match(/^tdef (\d+) linear/m)[1]);
  27.   });
  28. writetext(file, txt);
  29. function readtext(file, charset)
  30. {
  31.     var text;
  32.     var aso = new ActiveXObject('ADODB.Stream');
  33.     aso.Mode = 3;
  34.     aso.Type = 2;
  35.     if (charset) aso.Charset = charset;
  36.     else aso.Charset = 'gbk';
  37.     aso.Open();
  38.     aso.LoadFromFile(file);
  39.     text = aso.ReadText(-1);
  40.     aso.Close();
  41.     aso = null;
  42.     return text;
  43. }
  44. function writetext(file, text, charset)
  45. {
  46.     var aso = new ActiveXObject('ADODB.Stream');
  47.     aso.Mode = 3;
  48.     aso.Type = 2;
  49.     if (charset) aso.Charset = charset;
  50.     else aso.Charset = 'gbk';
  51.     aso.Open();
  52.     aso.WriteText(text);
  53.     aso.SaveToFile(file, 2);
  54.     aso.Close();
  55.     aso = null;
  56. }
复制代码
继续将JavaScript发扬光大。
1

评分人数

    • cpp: 感谢帮助技术 + 1

TOP

回复 2# cjiabing


    呵呵 不好意思啊 多谢你了 怎么给您分数呢

TOP

回复 3# powerbat


    呵呵 谢谢您慷慨帮助 感谢您

TOP

返回列表