[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理如何获取指定条件的文本列表?

本帖最后由 syqh2010 于 2015-3-8 04:20 编辑

问题已解决,多谢apang等多位高手的无私帮助。
附上代码:
  1. ''On Error Resume Next
  2. Dim strDir, arrKey, strDt,str1,str2,str3,str4,str5
  3. strDir = "D:\test"
  4. arrKey = Array("LensSpeed=1200")
  5. ''strDt = "2015/3/7 7:15:00"
  6. ''strDt = now()
  7. Do while true
  8. str1=now()     ''计时
  9. call Main()
  10. WScript.Sleep 5000
  11. str2=now()-str1   ''用时
  12. str3=Hour(formatdatetime(str2,0))    ''时
  13. str4=Minute(formatdatetime(str2,0))  ''分
  14. str5=Second(formatdatetime(str2,0))  ''秒
  15. strDt=DateAdd("h", "-" & str3 , now())
  16. strDt=DateAdd("n", "-" & str4 , strDt)
  17. strDt=DateAdd("s", "-" & str5 , strDt)
  18. Loop
  19. Sub Main()
  20.     Dim fso, f, d, txt, objFile, s
  21.     s = ""
  22.     Set fso = CreateObject("Scripting.FileSystemObject")
  23.     For Each f in fso.GetFolder(strDir).Files
  24.         If LCase(Right(f, 2)) = ".l" or LCase(Right(f, 2)) = ".r" Then
  25.             d = f.DateLastModified
  26.             If CDate(d) > CDate(strDt) Then
  27.                 Set objFile = fso.OpentextFile(f, 1)
  28.                 txt = objFile.ReadAll
  29. ''txt = Replace(txt,vbCrLf,Chr(10))
  30.                 If TestKeyWord(txt) Then s = s & f.Name & vbCrLf
  31.                 objFile.Close
  32.             End If
  33.         End If
  34.     Next
  35.     fso.OpenTextFile("a.txt", 2, true).Write s
  36.     ''CreateObject("WScript.Shell").Run "cmd /c ""ch.bat""",,true  ''调用bat
  37.     Set fso = Nothing
  38. End Sub
  39. Function TestKeyWord(ByVal txt)
  40.     Dim i
  41.     TestKeyWord = True
  42.     txt = vbCrLf & txt & vbCrLf
  43.     For i = 0 to UBound(arrKey)
  44.         If InStr(txt, vbCrLf & arrKey(i) & vbCrLf) = 0 Then
  45.             TestKeyWord = False : Exit For
  46.         End If
  47.     Next
  48. End Function
复制代码
一句话
找出文本中含有关键字,且修改时间大于TTT的文本列表。
一文件夹(类似中转站),里面的txt文件会实时更新(新的进来,旧的删除,或修改日期变化),文本数量较多,少则几百,多则上千。
txt文件名如11.txt,12.txt......
txt文件内容相似,如:
第1行
第2行
C  ABC
..
第200行

其中第3行格式相同,均为(:LC+2个空格+字符) 字符最少2个,最多5个(如A1、BC5、G456、、、等)
:LC在文本中是唯一的
若直接找文本,就找:LC  ABC
若按行查找, 就找第3行是否为:LC  ABC(注,空行也算一行)

请问如何找出:
1):LC后字符=ABC
2)文本修改时间>=2015/3/1 8:00
的文件名写入另一文本a.txt
【1)2)同时满足】
3)a.txt与程序在同一目录,需处理的文件夹在另一目录

a.txt内容如:
11.txt
12.txt
..
不知能否实现,希望各位能帮忙,谢谢!

回复 20# syqh2010


    最后一次修改
以后提问之前请务必想清楚了再提问,像这样不仅浪费了你的时间,也浪费别人不少的时间。

TOP

回复 17# apang


   
谢谢,你的代码完全符合我的要求,也很快。
但我的描述欠考虑,时间一直叠加,最终会大于当前时间,那时问题就来了。

请帮忙改为和当前的时间判断。
strDT=now()??
谢谢!

TOP

本帖最后由 apang 于 2015-3-6 19:52 编辑

回复 18# syqh2010


    已修改。保存为Test.vbs
注意每个关键字在文本中各占一行,前后不能包含空格,区分大小写

TOP

谢谢你!
请问是保存为bat,还是vbs。
另如何在循环哪里加如调用ch.bat,谢谢!

TOP

本帖最后由 apang 于 2015-3-7 16:13 编辑

要停止,在任务管理器中结束 WScript.exe 进程
或者,时间累加后的值大于当前时间即自动退出
  1. ''On Error Resume Next
  2. Dim strDir, arrKey, strDt
  3. strDir = "D:\Test"
  4. arrKey = Array(":L  ABC", ":OP  1.5", "XXX")
  5. strDt = "2015/3/1 8:05:00"
  6. Do while DateDiff("s", strDt, Now()) > 0
  7.     call Main()
  8.     strDt = DateAdd("n", "10", strDt)  ''加 10 分钟
  9.     WScript.Sleep 5000
  10. Loop
  11. Sub Main()
  12.     Dim fso, f, txt, objFile, s
  13.     s = ""
  14.     Set fso = CreateObject("Scripting.FileSystemObject")
  15.     For Each f in fso.GetFolder(strDir).Files
  16.         If LCase(Right(f, 4)) = ".txt" Then
  17.             If DateDiff("s", strDt, f.DateLastModified) > 0 Then
  18.                 Set objFile = fso.OpentextFile(f, 1)
  19.                 txt = objFile.ReadAll
  20.                 If TestKeyWord(txt) Then s = s & f.Name & vbCrLf
  21.                 objFile.Close
  22.             End If
  23.         End If
  24.     Next
  25.     fso.OpenTextFile("a.txt", 2, true).Write s
  26.     CreateObject("WScript.Shell").Run "cmd /c ""ch.bat""",,true  ''调用bat
  27.     Set fso = Nothing
  28. End Sub
  29. Function TestKeyWord(ByVal txt)
  30.     Dim i
  31.     TestKeyWord = True
  32.     txt = vbCrLf & txt & vbCrLf
  33.     For i = 0 to UBound(arrKey)
  34.         If InStr(txt, vbCrLf & arrKey(i) & vbCrLf) = 0 Then
  35.             TestKeyWord = False : Exit For
  36.         End If
  37.     Next
  38. End Function
复制代码
1

评分人数

TOP

Do...Loop循环如何才能"按了停止"呢?

"需保持a.txt中内容是最新的,防重复更改" 又是个什么意思呢?

TOP

回复 13# caruko


    拓展一下,感觉可以每次运行后修改 bat 自身的修改时间,这样更绿色。。。

TOP

回复 13# caruko
谢谢你的分析,我表达不好,问题我在顶楼更新了,请帮忙看看,谢谢!

TOP

回复 12# syqh2010


    其实,没有必要精确到 某个时间,如果你想知道 那个文件更新了,只要对比一个你自己创建的文件即可。

比如,
1、刚开始的时候,创建一个 time 文件。
2、过一段时间后,用dir 根据修改时间排序,排在 time 文件之后的,就都是新文件..
3、找出这些新文件,分析之后, 更新 time 文件。

重复2,3步骤。

TOP

回复 10# caruko


谢谢你!
请精确到分,谢谢!

TOP

修改自APANG的代码
  1. @echo off
  2. set "fPath=D:\Test\"
  3. set "dt=20150301080000"
  4. ::在下面填入keyword,用双引号包括
  5. for %a in (
  6. "LC  ABC"
  7. "xyz:   1.5"
  8. "mat   mr5"
  9. ) do echo,%a>>keyword
  10. pushd "%fPath%"
  11. set "ph=%fPath:~2%"
  12. set "w=wmic DataFile where "Drive='%fPath:~,2%' and Path='%ph:\=\\%' and Extension='txt'" get LastModified^,Name"
  13. (for /f "tokens=1*" %%a in ('%w% ^| findstr /b [0-9]') do (
  14.         if "%%~na" gtr "%dt%" (
  15.                 for /f "delims=" %%c in ("%%b") do echo,%%~nxc
  16.         )
  17. ))>$
  18. findstr /i /m /G:keyWord /f:$ > "%~dp0a.txt"
  19. del $
  20. del keyword
  21. pause
复制代码
1

评分人数

TOP

如果要精确到 秒  ,只能 wmic ,效率上不去。
如果只是精确到 分 ,速度要快N倍。

TOP

回复 8# apang

已经很好了。
请帮忙加几个关键字,谢谢!!

TOP

回复 7# syqh2010


    那么,你想要的最快速度有多快?总不会期望1050个文件0.1秒完成吧?

多个关键字判断不是问题,请提供1050个文件以便测试

TOP

返回列表