Board logo

标题: [文本处理] 求一个批处理代码实现实时监控并修改文件名,谢谢 [打印本页]

作者: yinguangrong    时间: 2008-12-24 13:50     标题: 求一个批处理代码实现实时监控并修改文件名,谢谢

本人用某种软件做计算,软件在每步计算(大概几分钟)完成后输出同名结果文件(例如beam.txt),但是会被下一步计算结果文件替换(郁闷!),当所有步计算都完成后软件会自动退出

想对该软件实时监控,以修改文件名
因为批处理简洁直观,又方便修改参数;)所以想到了批处理

具体要以下几个功能

第一步:每隔一定时间(例如20秒)检测软件进程是否存在(例如ansys.exe,完整的进程名,最好不是包含这个字段的进程
              名),如果存在执行第二步,如果不存在则延时(例如50秒)关机

第二步:检测指定路径下文件是否存在(例如D:\result\beam.txt),如果存在则将该文件改名为beam*.txt(符号“*”
              第几次检测到,也就是第几个文件,加在文件名最后),这样文件就不会被覆盖了^-^。(或者另外一个txt文件
              中储存了文件名,文件名用 回车符分隔,再从里面导入文件名),然后回到第一步。
              问题是,可能碰巧ansys.exe这个程序还没输出完beam.txt,从而无法修改文件名,如何忽略不能修改的错          误,延时再修改???(或者直接判断能否修改文件名,能则修改,不能则延时),修改成功后回到第一步。

第一步的代码自己在论坛上找到一个,如下:
@echo off
tasklist|findstr /i "ansys.exe" ||shutdown -s -t 50
ping 127.1 -n 20 >nul 2>nul
call %0

美中不足的是,只是能检测到包含ansys字段的进程名

第二步是在不会了,本人对批处理只知道皮毛,希望好心人能相助!谢谢!!
作者: Batcher    时间: 2008-12-24 14:53

美中不足的是,只是能检测到包含ansys字段的进程名

C:\test>findstr /?
在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。

  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
作者: yinguangrong    时间: 2008-12-24 16:48

找你的意思是不是还要把进程名写入到一个txt文档中,然后在查找匹配?
作者: Batcher    时间: 2008-12-24 17:19     标题: 回复 3楼 的帖子

我没有那个意思
我是说给findstr加上指定的开关就可以解决你说的“美中不足”的问题
作者: yinguangrong    时间: 2008-12-24 17:55

哦,其实第一步不是重点,难的是第二步,估计是我写的太多,人都被字数吓跑了,感觉应该挺简单的啊!今天dos联盟论坛上不去,等能上了去那儿问问吧!谢谢了
作者: Batcher    时间: 2008-12-24 19:59     标题: 回复 5楼 的帖子

字数越多说明问题描述清楚,这样怎么可能会把人吓跑呢?
看来楼主还不了解这里的批处理水平^_^
作者: 随风    时间: 2008-12-24 20:52

第一步好办,给findstr 加上 c 参数就可以完全匹配文件名了
如:tasklist|findstr /ic:"ansys.exe" ||shutdown -s -t 50
第二步还真有点麻烦:
你的软件在计算完第一步后(只有此时才能改名)第二步是一开始就往文件中写入内容吗?
也就是说批处理只能在第一步完成后,第二步开始前才能进行改名操作。这个时间差有多少?或者说这段时间内程序会有什么特征?否则批处理无法准确把握这个时间差。
作者: yinguangrong    时间: 2008-12-24 23:22

我再解释下吧,
第一,软件每算完一步后都会输出一个同名的txt结果文件,在计算过程中不输出文件。后一次计算输出结果都会覆盖前一步的!(因此,在后一次输出之前要文件改名!)

第二,软件每一步的计算大概花几分钟到几十分钟不等,但是输出结果的时间最多也就几十秒(此时文件虽然已经创建,但是改不了文件名的)。输出完结果后再进行下一步的计算,。再说一遍,计算过程中不输出文件。一共数十步。

因为批处理非常容易改参数,所以时间控制我会自己设置!循环检测时间在20秒左右应该没问题的!这点请不要担心!

还有一个小问题,就是如何保证最后一个结果文件也能被改名,因为最后一步算完后,输出结果,然后程序自动退出,然后检测程序进程不存在就给我关机了!!哈哈哈

谢谢超版关心!
作者: yinguangrong    时间: 2008-12-24 23:25

软件是算完第一步,输出一个文件,再接着计算第二步,算完后输出第二个同名文件,接着计算第三步.......直到每一步算完。
作者: yinguangrong    时间: 2008-12-25 12:52

@echo off&setlocal ENABLEDELAYEDEXPANSION
set n=1
:star
ping 127.1 -n 20 >nul 2>nul
tasklist|findstr /ic:"ansys.exe"
if %errorlevel%==0 (
        goto exist
) else (
        goto exit
)


:exist
ren D:\result\beam.txt d:\result\beam!n!.txt
if %errorlevel%==0 (
        set /a n=!n!+1
        goto star
) else (
        goto star
)

:exit
ren D:\result\beam.txt d:\result\beam!n!.txt
shutdown /f /s /t 50
exit

上面是我求得的代码,自己正在测试,帮忙看看能不能改进




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