[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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的文件名都不一样。
恳请给位高手帮忙。谢谢啦。

本帖最后由 terse 于 2012-3-21 15:13 编辑

回复 39# cpp
不确定你那边情况
我这里测试了一下 循环50 主文件夹下CP.GS内容 更改50次
也没办法获得你那边更多详情 我给出测试前后文件对比 你看下  是否有文件路径问题或其他问题
  1. 'reinit'
  2. 'open d:\123\hcflmup9\cflm.ctl'
  3. 'set parea 1 10 1 7.5'
  4. 'set xlopts 1 4 0.1'
  5. 'set ylopts 1 4 0.1'
  6. i=1
  7. while(i<=5)
  8. 'printim d:\123\hcflmup9\700h_'time'.png white'
复制代码
运行一次后 修改如下 循环下去  每次修改的
'reinit'
'open d:\123\76lk9bi0\6lk9.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:\123\76lk9bi0\700h_'time'.png white'
1

评分人数

    • cpp: 多谢技术 + 1

TOP

回复 38# cjiabing


    私下里给吧 发个私信什么的

TOP

回复 38# cjiabing


    给我你的QQ号 我加你

TOP

回复 36# terse


    您好 你的代码我按照您说的要求改了后 还是没有进行循环,只是第一次出图了 后面没有出图 为什么呢?set "ph=d:\2010\"
只改了这个路劲以及grads的路径

TOP

回复 37# cpp


    如果你在Q群里你加我吧,这里说不清楚了~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 34# cjiabing


    我将代码修改成这样
@echo off&setlocal enabledelayedexpansion
::把xxx.gs、grads和本批处理都放在同一目录下运行。
::cp.gs是标准,你不能随意修改,特别是d:\2010\1\这个路径。
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 (cp.gs) do (
        set "var=%%i"
        if "%%i"=="'open D:\2010\1\1.ctl'" set var=!var:\1.ctl=\%%~na.ctl!
        if "%%i"=="while(i<=6)" set "var=while(i<=!str!)"
        for /d  %%l in ("%%~dpa") do  set "var=!var:\2010\1\700h_=%%~fl700h_!"
        echo;!var!
    )>>"%~dp0new_cp.gs"
"D:\Program Files\OpenGrADS\Contents\Cygwin\Versions\2.0.a9.oga.1\i686\grads.exe" -blc "%~dp0new_cp.gs"
    del /f "%~dp0new_cp.gs">nul 2>nul
)
pause
由于if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:d:\chenp\cccc.ctl=d:\chenp\%%~na.ctl!出来的结果就是open D:\2010\1\D:\2010\1\1.ctl
最重要的一点就是还是没有改gs 1.ctl没有变为2.ctl 循环没有进行 只是运行了第一次
我将先试了三个ctl  都放到D:\2010\1\下了gs和本批处理在d:\2010\下
不知道这个是怎么回事呢 ?

TOP

回复 31# cpp
假设总文件夹在 D:\123\   (执行时自行修改)
另grads 程序不在D:\123\ 下  那么应该给出路径
前面代码 一并修改
  1. @echo off&setlocal enabledelayedexpansion
  2. set "ph=d:\123\"
  3. cd /d "%ph%"
  4. for /f "tokens=*" %%i in ('dir /s /b /a-d "%ph%*.ctl"') do (
  5.     for /f "usebackq tokens=1,2" %%j in ("%%~i") do if /i "%%j"=="tdef" set "N=%%k"
  6.     (for /f "usebackq tokens=*" %%j in ("cp.gs") do (
  7.         set "Str=%%j"
  8.         if "%%~xj" neq ".ctl'" (
  9.            if "!str:~,9!" neq "while(i<=" (
  10.               if "!str:~,9!" equ "'printim " (echo 'printim %%~dpi%%~nxj)else echo %%j
  11.            ) else echo while^(i^<=!N!^)
  12.         ) else echo 'open %%i'
  13.     ))>"~temp.mp"
  14.     move "~temp.mp" "%ph%cp.gs"
  15.     grads -blc "%ph%cp.gs"
  16. )
  17. pause
复制代码

TOP

回复 30# terse


    呵呵,所以,我在代码后面提示了,基本上是投机取巧的,如果实际情况不一样还得修改。那段代码确实有点问题,我以修正过来了。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 33# cpp


    不好意思,修正了一下,没有东西测试容易产生错误!~
  1. @echo off&setlocal enabledelayedexpansion
  2. ::把xxx.gs、grads和本批处理都放在同一目录下运行。
  3. ::xxx.gs是标准,你不能随意修改,特别是d:\chenp这个路径。
  4. for /r %%a in (*.ctl) do (
  5.     for /f "usebackq tokens=1,2" %%x in ("%%~a") do if /i "%%x"=="tdef" set "str=%%y"
  6.     for /f "tokens=*" %%i in (xxx.gs) do (
  7.         set "var=%%i"
  8.         if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:d:\chenp\cccc.ctl=d:\chenp\%%~na.ctl!
  9.         if "%%i"=="while(i<=6)" set "var=while(i<=!str!)"
  10.         for /d  %%l in ("%%~dpa") do  set "var=!var:d:\chenp\700h_=%%~fl700h_!"
  11.         echo;!var!
  12.     )>>"%~dp0new_xxx.gs"
  13.     grads -blc "%~dp0new_xxx.gs"
  14.     del /f "%~dp0new_xxx.gs">nul 2>nul
  15. )
  16. pause
复制代码

强调一下:你要把所有文件盒程序都放在同一目录下使用。同时,修改xxx.gs文件需要修改本代码。
有两个地方可能出点问题了:一个是替换文件名cccc.ctl的,一个是%~dp0new_xxx.gs的,现在一同修改过来了,你使用这个就可以了。
如果你的grads放在其他地方,你可以用路径来表示它,比如:"D:\Program Files\GRADS\grads.exe"——路径有空格需要使用双引号。
还有其他问题请一并反馈到一楼。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 22# cjiabing


    我发现一个问题 我早上再单位的电脑运行代码的时候是可以该ctl名字 并且是能够循环的,但是
不能运行grads这句说是找不到可行文件,可是到了晚上我在自己的笔记本电脑上运行的时候,grads这
句能够运行,但是循环只有一次。不知道这个怎么解释呢。

TOP

回复 28# cjiabing


    cjiabing :不好意思 又打扰你了
我在运行你的代码时出现不能循环的问题,运行了第一个grads -blc "%~dp1new_cp.gs"
后就完全停止了,这是为什么呢?

TOP

回复 21# terse


    您好 我运行您给的代码后 没有出图 也没有出现新的gs

TOP

回复 28# cjiabing
看了下版主代码 觉得下面这句有疑惑
  1. if "%%i"=="'open d:\chenp\cccc.ctl'" set var=!var:\cccc.ctl=\%%~na.ctl!——这个是修改文件名的。
复制代码
你给这里的条件是 if "%%i"=="'open d:\chenp\cccc.ctl'"  但实际不定的  也就是并不一定是 “d:\chenp\cccc.ctl”

TOP

回复 28# cjiabing


    恩 其实我说了每个子文件夹下又有一个ctl的 ,不过没事我把这些ctl统一放到一个文件夹下拉,多谢你的解释噢

TOP

返回列表