返回列表 发帖

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

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

现在有一个总文件夹(名字暂且叫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

@echo off&setlocal enabledelayedexpansion
for /r %%a in (*.ctl) do (
    for /f "usebackq tokens=1,2" %%x in ("%%~a") do if /i "%%x"=="tdef" set "str=%%y"
    for /f "tokens=*" %%i in (xxx.gs) do (
        set "var=%%i"
        if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:\cccc.ctl=\%%~na.ctl!
        if "%%i"=="while(i<=6)" set "var=while(i<=!str!)"
        for /d  %%l in (*) do set var=!var:d:\chenp\700h_=%%~nl\700h_!
        echo;!var!
    )
)&echo;&echo;
pause
COPY
寂寞是黑白的,但黑白不是寂寞,是永恒。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


   
@echo off&setlocal enabledelayedexpansion
for /r %%a in (*.ctl) do (
for /f "usebackq tokens=1,2" %%x in ("%%~a") do if /i "%%x"=="tdef" set "str=%%y"
for /f "tokens=*" %%i in (xxx.gs) do (
set "var=%%i"
if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:\cccc.ctl=\%%~na.ctl!
if "%%i"=="while(i<=6)" set "var=while(i<=!str!)"
for /d %%l in ("%%~dpa") do set "var=!var:d:\chenp\700h_=%%~fl700h_!"
echo;!var!
)>>new_xxx.gs
pause
echo grads -blc "%~dp1new_xxx.gs"
del /f new_xxx.gs>nul 2>nul
)
pauseCOPY

注意:
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

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

评分人数

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

TOP

@set @n=0/*& echo off
set "folder=d:\总文件夹"
copy /y xxx.gs xxx.gs.bak
cscript.exe -e:jscript "%~f0" "%folder%" || (pause&exit/b)
echo grads -blc "%folder%\xxx.gs"
rem do something you like.
exit/b
*/
folder = WScript.Arguments(0);
file = folder + "\\xxx.gs";
strQuery = "select name from CIM_DataFile where "
    + " drive='" + folder.substr(0,2) + "' and "
    + " path like '" + folder.substr(2).replace(/\\/g,'\\\\') + "\\\\%'"
    + " and extension='ctl'";
wmi = new ActiveXObject("WbemScripting.SWbemLocator").ConnectServer();
colFiles = wmi.ExecQuery(strQuery, "WQL", 48);
e = new Enumerator(colFiles);
arrFiles = [];
for (; !e.atEnd(); e.moveNext())  arrFiles.push(e.item().name);
txt = readtext(file);
i = 0;
txt = txt.replace(/^'open ([^']+)|^while\(i<=(\d+)\)/gm,
  function(s0,s1,s2){
    if (s1) return s0.replace(s1, arrFiles[i]);
    else return s0.replace(s2,
        readtext(arrFiles[i++]).match(/^tdef (\d+) linear/m)[1]);
  });
writetext(file, txt);
function readtext(file, charset)
{
    var text;
    var aso = new ActiveXObject('ADODB.Stream');
    aso.Mode = 3;
    aso.Type = 2;
    if (charset) aso.Charset = charset;
    else aso.Charset = 'gbk';
    aso.Open();
    aso.LoadFromFile(file);
    text = aso.ReadText(-1);
    aso.Close();
    aso = null;
    return text;
}
function writetext(file, text, charset)
{
    var aso = new ActiveXObject('ADODB.Stream');
    aso.Mode = 3;
    aso.Type = 2;
    if (charset) aso.Charset = charset;
    else aso.Charset = 'gbk';
    aso.Open();
    aso.WriteText(text);
    aso.SaveToFile(file, 2);
    aso.Close();
    aso = null;
}COPY
继续将JavaScript发扬光大。
1

评分人数

    • cpp: 感谢帮助技术 + 1

TOP

回复 2# cjiabing


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

TOP

回复 3# powerbat


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

TOP

返回列表