找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 130314|回复: 41

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

[复制链接]
发表于 2012-3-18 11:40:12 | 显示全部楼层 |阅读模式
各位高手大家好 我现在有一个棘手的批处理问题先具体说明下希望大家能帮助下我:

现在有一个总文件夹(名字暂且叫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的文件名都不一样。
恳请给位高手帮忙。谢谢啦。
发表于 2012-3-18 12:37:49 | 显示全部楼层
是不是 有50个xxx.gs
如果是 那就是要修改子文件夹里的 xxx.gs 吗?
 楼主| 发表于 2012-3-18 12:52:31 | 显示全部楼层
有50个文件夹 但是只有一个gs,都在一个总的文件夹下面 每次循环只修改gs  运行
 楼主| 发表于 2012-3-18 12:55:01 | 显示全部楼层
回复 2# terse

有50个文件夹 但是只有一个gs,都在一个总的文件夹下面 每次循环只修改gs  运行
发表于 2012-3-18 13:13:54 | 显示全部楼层
楼主最好把一楼的内容排版好了再说,否则看着别扭不明就里。注意分行、序号整理好。
 楼主| 发表于 2012-3-18 13:17:37 | 显示全部楼层
回复 5# cjiabing


    好的
发表于 2012-3-18 13:56:46 | 显示全部楼层
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的文件名都不一样。
——————原来是不一样!~只有一个????
发表于 2012-3-18 15:03:11 | 显示全部楼层
  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
复制代码
 楼主| 发表于 2012-3-18 15:23:39 | 显示全部楼层
回复 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。
发表于 2012-3-18 17:14:42 | 显示全部楼层
回复 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、只针对你提问的进行修改,使用时需要根据实际情况修改替换的值以及路径。
 楼主| 发表于 2012-3-18 19:47:13 | 显示全部楼层

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

本帖最后由 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的名字都不一样。
恳请给位高手帮忙。谢谢啦。
发表于 2012-3-18 20:48:42 | 显示全部楼层
  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技术 +2 收起 理由
cpp + 1 乐于助人
CrLf + 1 乐于助人

查看全部评分

发表于 2012-3-18 21:35:29 | 显示全部楼层
  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技术 +1 收起 理由
cpp + 1 感谢帮助

查看全部评分

 楼主| 发表于 2012-3-18 22:26:16 | 显示全部楼层
回复 2# cjiabing


    呵呵 不好意思啊 多谢你了 怎么给您分数呢
 楼主| 发表于 2012-3-18 22:26:48 | 显示全部楼层
回复 3# powerbat


    呵呵 谢谢您慷慨帮助 感谢您
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 21:12 , Processed in 0.020569 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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