Board logo

标题: [文件操作] [已解决]BAT怎样批量单个读取、删除、转移txt文件? [打印本页]

作者: kobekiln    时间: 2013-12-9 21:06     标题: [已解决]BAT怎样批量单个读取、删除、转移txt文件?

本帖最后由 kobekiln 于 2013-12-11 15:52 编辑

各位大神好
小弟前来求助问题:

我自己变了两个程序,存放为“e:\network data\p1.exe”和“e:\network data\p2.exe”,这两个程序需要读取“e:\network data\file0\”下的txt文件(参数设定文件)来计算算例。

程序的计算结果分别存放于“e:\network data\file1”和“e:\network data\file2”下面。

现在我想批量计算算例,所以放了n个txt(tj.txt tj1.txt tj2.txt……tjn.txt)在 file0中,我想实现这个循环过程:

1:检查file0中有无文件,若有则继续,若没有文件则结束,

2:运行p1.exe

3:当p1.exe运行结束后,再运行p2.exe

4:当p2.exe运行结束后,在network data下新建一个文件夹filex(x随着循环次数增加而变化,保证不同算例的结果存于不同的文件夹),将file1和file2中的所有文件剪切到filex下面,若存在文件重名,则更名保存

5:删除file0中的tj.txt,将file0下的第一个txt文件(或者是将tjx.txt,x随着循环次数增加而变化,保证每次都将下一个算例的参数文件重命名为 tj.txt,)重命名为tj.txt

6:重新跳到第一步。

有点复杂啊,真心求助大神帮忙。


我重新想了想,整个过程应该是这样比较好:
1:检查file0中有无文件,若有则继续,若没有文件则结束,

2:将file0下的第一个txt文件(或者是将tjx.txt,x随着循环次数增加而变化,保证每次都将这个算例的需要参数文件重命名为 tj.txt,)重命名为tj.txt

3:运行p1.exe

4:当p1.exe运行结束后,再运行p2.exe

5:当p2.exe运行结束后,在network data下新建一个文件夹filex(x随着循环次数增加而变化,保证不同算例的结果存于不同的文件夹),将file1和file2中的所有文件剪切到filex下面,若存在文件重名,则更名保存

6:删除file0中的tj.txt

7:重新跳到第一步。

作者: apang    时间: 2013-12-10 00:48

本帖最后由 apang 于 2013-12-10 09:37 编辑
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. f = "" : path = "E:\network data"
  3. For Each file in fso.GetFolder(path & "\file0").Files
  4.     If LCase(Right(file.Name,4)) = ".txt" and _
  5.     LCase(file.Name) <> "tj.txt" Then f = file : Exit For
  6. Next
  7. If f <> "" Then
  8.     fso.GetFile(path & "\file0\tj.txt").Delete
  9.     fso.GetFile(f).Name = "tj.txt"
  10. Else WScript.Quit
  11. End If
  12. Set ws = CreateObject("WScript.Shell")
  13. ws.Run chr(34) & path & "\P1.EXE" & chr(34),,true
  14. ws.Run chr(34) & path & "\P2.EXE" & chr(34),,true
  15. n = 3
  16. While fso.FolderExists(path & "\file" & n)
  17.     n = n + 1
  18. Wend
  19. strNewFolder = path & "\file" & n
  20. fso.CreateFolder(strNewFolder)
  21. fso.MoveFile path & "\file1\*",strNewFolder & "\"
  22. For Each file in fso.GetFolder(path & "\file2").Files
  23.     strNewFile = file.Name
  24.     While fso.FileExists(strNewFolder & "\" & strNewFile)
  25.         strNewFile = "BAK_" & strNewFile
  26.     Wend
  27.     fso.GetFile(file).Move strNewFolder & "\" & strNewFile
  28. Next
复制代码
保存为test.vbs
如果存在同名文件,则在原文件名前加"BAK_"字样。
作者: lifei259    时间: 2013-12-10 01:41

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /r file0 %%i in (tj*.txt) do (set /a n+=1
  4. ren "%%~fi" "tj.txt" 2>nul
  5. start /w p1.exe
  6. start /w p2.exe
  7. md fileX!n! 2>nul
  8. move file1\*.* fileX!n!
  9. move file2\*.* fileX!n!
  10. del /a /f /q "%%~dpitj.txt"
  11. )
  12. pause
复制代码
代码放在e:\network data\下运行。
因为有了Feli0 Feli1 Feli2 所以FeliX没有从0 开始,为了对应次数,文件名改成Filx1~FelixN这样才能行。
作者: kobekiln    时间: 2013-12-10 08:53

回复 2# apang
谢谢大神!我来试试!
作者: kobekiln    时间: 2013-12-10 08:54

回复 3# lifei259

谢谢大神,一会儿试试!
作者: kobekiln    时间: 2013-12-10 09:43

回复 2# apang
大神,好像还是有些问题啊。可以私下请教你一下嘛
作者: apang    时间: 2013-12-10 10:15

回复 6# kobekiln


   
2:将file0下的第一个txt文件(或者是将tjx.txt,x随着循环次数增加而变化,保证每次都将这个算例的需要参数文件重命名为 tj.txt,)重命名为tj.txt

"第一个txt"是如何确定的?tjx.txt中的x又是如何确定的呢?与filex中的x值一样吗?
作者: kobekiln    时间: 2013-12-10 11:04

本帖最后由 kobekiln 于 2013-12-10 14:06 编辑

回复 7# apang
如果我将tj1.txt tj2.txt……tjx.txt按名称排列。那么该文件夹下第一个文件就是我这个算例要用的文件了。tjx.txt和filex的值应该是不一样的,主要目的是将各个算例的结果按顺序存放在不同的文件夹中就好了,可以这样,tj1算的结果放在file3中,tj2算的结果放在file4中,这样。

谢谢大神,
作者: kobekiln    时间: 2013-12-10 11:05

回复 7# apang
原来是vbs...我说怎么不管用,我再试试,谢谢大神!
作者: kobekiln    时间: 2013-12-10 14:32

回复 2# apang
大神,您这个程序我测试了,很棒啊!可以运行,达到了一些效果。但是好像存在点问题,


1,您的只有在file0文件夹中有 “tj.txt”时,程序才能继续。我是想,只要file0中有txt文件存在就继续到第二步“重命名的部分”

2,您的程序只循环一次就结束了,不知道是为啥。

     我是这样的。我的的p1 p2程序需要读取file0中名为tj.txt的文件来设置参数进行计算,计算结果存放在file1和file2中。

     我是想批量计算n个算例,所以把n个txt(tj1.txt   tj2.txt   tj3.txt   ……   tjn.txt) 放在file0文件夹内。我想让这个批处理命令,能够首先把tj1重名命成 tj.xt 然后 运行p1 p2程序

     计算, 然后把每个算例的计算结果放在一个新的文件夹(例如file3)内,然后删掉file0中这个已经用过tj.txt。接下来把file0中的tj2.txt重命名为tj.txt,继续开 p1 p2计算,结果放到新的文件夹

(例如file4)内。如此循环。

谢谢大神!!
作者: apang    时间: 2013-12-10 22:38

越弄越复杂了
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Do
  3.     f = "" : path = "E:\network data"
  4.     For Each file in fso.GetFolder(path & "\file0").Files
  5.         If LCase(Right(file.Name,4)) = ".txt" Then f = file : Exit For
  6.     Next
  7.     If f = "" Then WScript.Quit
  8.     call main()
  9. Loop
  10. function main()
  11.     If LCase(fso.GetFile(f).Name) <> "tj.txt" Then
  12.         If fso.FileExists(path & "\file0\tj.txt") Then
  13.             fso.GetFile(path & "\file0\tj.txt").Delete
  14.         End If
  15.         fso.GetFile(f).Name = "tj.txt"
  16.     End If
  17.     Set ws = CreateObject("WScript.Shell")
  18.     ws.Run chr(34) & path & "\P1.EXE" & chr(34),,true
  19.     ws.Run chr(34) & path & "\P2.EXE" & chr(34),,true
  20.     n = 3
  21.     While fso.FolderExists(path & "\file" & n)
  22.         n = n + 1
  23.     Wend
  24.     strNewFolder = path & "\file" & n
  25.     fso.CreateFolder(strNewFolder)
  26.     fso.MoveFile path & "\file1\*",strNewFolder & "\"
  27.     For Each file in fso.GetFolder(path & "\file2").Files
  28.         strNewFile = file.Name
  29.         While fso.FileExists(strNewFolder & "\" & strNewFile)
  30.             strNewFile = "BAK_" & strNewFile
  31.         Wend
  32.         fso.GetFile(file).Move strNewFolder & "\" & strNewFile
  33.     Next
  34.     fso.GetFile(path & "\file0\tj.txt").Delete
  35. End function
复制代码

作者: kobekiln    时间: 2013-12-11 15:52

回复 11# apang 大神你太吊了!!!




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