标题: [文件操作] [已解决]批处理如何获取指定条件的文本列表? [打印本页]
作者: syqh2010 时间: 2015-3-3 09:35 标题: [已解决]批处理如何获取指定条件的文本列表?
本帖最后由 syqh2010 于 2015-3-8 04:20 编辑
问题已解决,多谢apang等多位高手的无私帮助。
附上代码:- ''On Error Resume Next
- Dim strDir, arrKey, strDt,str1,str2,str3,str4,str5
- strDir = "D:\test"
- arrKey = Array("LensSpeed=1200")
- ''strDt = "2015/3/7 7:15:00"
- ''strDt = now()
-
- Do while true
- str1=now() ''计时
- call Main()
- WScript.Sleep 5000
- str2=now()-str1 ''用时
- str3=Hour(formatdatetime(str2,0)) ''时
- str4=Minute(formatdatetime(str2,0)) ''分
- str5=Second(formatdatetime(str2,0)) ''秒
-
- strDt=DateAdd("h", "-" & str3 , now())
- strDt=DateAdd("n", "-" & str4 , strDt)
- strDt=DateAdd("s", "-" & str5 , strDt)
- Loop
-
- Sub Main()
- Dim fso, f, d, txt, objFile, s
- s = ""
- Set fso = CreateObject("Scripting.FileSystemObject")
- For Each f in fso.GetFolder(strDir).Files
- If LCase(Right(f, 2)) = ".l" or LCase(Right(f, 2)) = ".r" Then
- d = f.DateLastModified
- If CDate(d) > CDate(strDt) Then
- Set objFile = fso.OpentextFile(f, 1)
- txt = objFile.ReadAll
- ''txt = Replace(txt,vbCrLf,Chr(10))
- If TestKeyWord(txt) Then s = s & f.Name & vbCrLf
- objFile.Close
- End If
- End If
- Next
- fso.OpenTextFile("a.txt", 2, true).Write s
- ''CreateObject("WScript.Shell").Run "cmd /c ""ch.bat""",,true ''调用bat
- Set fso = Nothing
- End Sub
-
- Function TestKeyWord(ByVal txt)
- Dim i
- TestKeyWord = True
- txt = vbCrLf & txt & vbCrLf
- For i = 0 to UBound(arrKey)
- If InStr(txt, vbCrLf & arrKey(i) & vbCrLf) = 0 Then
- TestKeyWord = False : Exit For
- End If
- Next
- 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
..
不知能否实现,希望各位能帮忙,谢谢!
作者: pcl_test 时间: 2015-3-3 14:10
本帖最后由 pcl_test 于 2015-3-3 14:21 编辑
回复 1# syqh2010 - @echo off
- setlocal enabledelayedexpansion
- ::设置文件夹路径
- cd /d "D:\test\"
- for %%a in (*.txt) do (
- ::导出文件列表
- set "file=%%~dpnxa"
- set "file=!file:\=\\!"
- for /f "tokens=1* delims=." %%e in ('wmic datafile where name^="!file!" get LastModified ^|find "+"') do set "fdt=%%e"
- >temp.vbs echo,if !fdt! ^>= 20150301080000 then
- >>temp.vbs echo,WSH.Echo "true"
- >>temp.vbs echo,else
- >>temp.vbs echo,WSH.Echo "false"
- >>temp.vbs echo,end if
- for /f %%b in ('cscript /nologo temp.vbs') do set "t=%%b"
- del temp.vbs /f /q >nul
- if "!t!" equ "true" >>"%~dp0a.txt" echo,%%~a
-
- ::修改:LC值
- for /f "tokens=1* delims=:" %%b in ('findstr /n ":LC" "%%a"') do set n=%%b
- set m=1
- for /f "tokens=1* delims=:" %%c in ('findstr /n .* "%%a"') do (
- if !m! == !n! (
- >>$ echo,:LC ABC
- ) else (
- >>$ echo,%%d
- )
- set /a m+=1
- )
- move $ "%%a"
- )
- pause
复制代码
作者: syqh2010 时间: 2015-3-3 15:55
谢谢你,我稍后试试。
我描述可能有歧义,是找出ABC,不是修改成ABC。
作者: pcl_test 时间: 2015-3-3 18:15
本帖最后由 pcl_test 于 2015-3-3 18:47 编辑
回复 3# syqh2010
嗯,提问者的表达都很差,而且很不严谨,批处理的编写是要依据一定的规则的,如果问题描述不够清楚和严谨,那么就会有出入,像你列出的条件,是要找出同时满足前两个要求的txt文件吗?还是分别列出来?还有第三行的意思,要是前面有空行,一个空行算一行吗?如果C是唯一的,那么就不需要再画蛇添足的说明在第三行,因为第三行的意思会有歧义- @echo off
- setlocal enabledelayedexpansion
- ::设置文件夹路径
- cd /d "D:\test\"
- for %%a in (*.txt) do (
- set "file=%%~dpnxa"
- set "file=!file:\=\\!"
- for /f "tokens=1* delims=." %%e in ('wmic datafile where name^="!file!" get LastModified ^|find "+"') do set "fdt=%%e"
- >temp.vbs echo,if !fdt! ^>= 20150301080000 then
- >>temp.vbs echo,WSH.Echo "true"
- >>temp.vbs echo,else
- >>temp.vbs echo,WSH.Echo "false"
- >>temp.vbs echo,end if
- for /f %%b in ('cscript /nologo temp.vbs') do set "t=%%b"
- del temp.vbs /f /q >nul
- if "!t!" equ "true" (
- findstr /c:":LC ABC" "%%a" >nul && >>"%~dp0a.txt" echo,%%~a
- )
- )
- pause
复制代码
作者: syqh2010 时间: 2015-3-3 21:40
回复 4# pcl_test
谢谢,你提的问题已在顶楼更新。
指明第3行,主要是考虑到方便自已更改,查找其它行。比如列出第2行是AA,且第5行是CC,且、、的列表。
代码可以用,是我想要的效果。只是速度稍有些慢,处理20个文本需要15秒。
我有个笨办法,
1)用find 找出含 关键字的文本,生成列表1.txt
2)用Dir筛出时间>??的文本,生成列表2.txt
3)找出1.txt,2.txt中公共部分,得到a.txt
但不会写。
作者: apang 时间: 2015-3-4 21:29
- @echo off
- set "fPath=D:\Test\"
- set "dt=20150301080000"
- set "keyWord=:LC ABC"
-
- pushd "%fPath%"
- set "ph=%fPath:~2%"
- set "w=wmic DataFile where "Drive='%fPath:~,2%' and Path='%ph:\=\\%' and Extension='txt'" get LastModified^,Name"
-
- (for /f "tokens=1*" %%a in ('%w% ^| findstr /b [0-9]') do (
- if "%%~na" gtr "%dt%" (
- for /f "delims=" %%c in ("%%b") do echo,%%~nxc
- )
- ))>$
-
- findstr /i /r /e /m /c:"%keyWord%" /f:$ > "%~dp0a.txt"
- del $
- pause
复制代码
作者: syqh2010 时间: 2015-3-5 02:04
本帖最后由 syqh2010 于 2015-3-5 05:34 编辑
回复 6# apang
谢谢你,可以用,是我想要的效果。
查找1050个文件用时约16秒,不知有没更快的办法。
另请问,如果查找的关键字不止一个,
如同时存在“LC ABC ”、“xyz: 1.5”、“mat mr5”,该如何修改,谢谢!
作者: apang 时间: 2015-3-5 09:38
回复 7# syqh2010
那么,你想要的最快速度有多快?总不会期望1050个文件0.1秒完成吧?
多个关键字判断不是问题,请提供1050个文件以便测试
作者: syqh2010 时间: 2015-3-5 10:04
回复 8# apang
已经很好了。
请帮忙加几个关键字,谢谢!!
作者: caruko 时间: 2015-3-5 10:50
如果要精确到 秒 ,只能 wmic ,效率上不去。
如果只是精确到 分 ,速度要快N倍。
作者: caruko 时间: 2015-3-5 11:10
修改自APANG的代码- @echo off
- set "fPath=D:\Test\"
- set "dt=20150301080000"
-
- ::在下面填入keyword,用双引号包括
- for %a in (
- "LC ABC"
- "xyz: 1.5"
- "mat mr5"
- ) do echo,%a>>keyword
-
- pushd "%fPath%"
- set "ph=%fPath:~2%"
- set "w=wmic DataFile where "Drive='%fPath:~,2%' and Path='%ph:\=\\%' and Extension='txt'" get LastModified^,Name"
-
- (for /f "tokens=1*" %%a in ('%w% ^| findstr /b [0-9]') do (
- if "%%~na" gtr "%dt%" (
- for /f "delims=" %%c in ("%%b") do echo,%%~nxc
- )
- ))>$
-
- findstr /i /m /G:keyWord /f:$ > "%~dp0a.txt"
- del $
- del keyword
- pause
复制代码
作者: syqh2010 时间: 2015-3-5 15:02
回复 10# caruko
谢谢你!
请精确到分,谢谢!
作者: caruko 时间: 2015-3-5 16:38
回复 12# syqh2010
其实,没有必要精确到 某个时间,如果你想知道 那个文件更新了,只要对比一个你自己创建的文件即可。
比如,
1、刚开始的时候,创建一个 time 文件。
2、过一段时间后,用dir 根据修改时间排序,排在 time 文件之后的,就都是新文件..
3、找出这些新文件,分析之后, 更新 time 文件。
重复2,3步骤。
作者: syqh2010 时间: 2015-3-5 18:15
回复 13# caruko
谢谢你的分析,我表达不好,问题我在顶楼更新了,请帮忙看看,谢谢!
作者: CrLf 时间: 2015-3-5 18:18
回复 13# caruko
拓展一下,感觉可以每次运行后修改 bat 自身的修改时间,这样更绿色。。。
作者: apang 时间: 2015-3-6 15:37
Do...Loop循环如何才能"按了停止"呢?
"需保持a.txt中内容是最新的,防重复更改" 又是个什么意思呢?
作者: apang 时间: 2015-3-6 16:19
本帖最后由 apang 于 2015-3-7 16:13 编辑
要停止,在任务管理器中结束 WScript.exe 进程
或者,时间累加后的值大于当前时间即自动退出- ''On Error Resume Next
- Dim strDir, arrKey, strDt
- strDir = "D:\Test"
- arrKey = Array(":L ABC", ":OP 1.5", "XXX")
- strDt = "2015/3/1 8:05:00"
-
- Do while DateDiff("s", strDt, Now()) > 0
- call Main()
- strDt = DateAdd("n", "10", strDt) ''加 10 分钟
- WScript.Sleep 5000
- Loop
-
- Sub Main()
- Dim fso, f, txt, objFile, s
- s = ""
- Set fso = CreateObject("Scripting.FileSystemObject")
- For Each f in fso.GetFolder(strDir).Files
- If LCase(Right(f, 4)) = ".txt" Then
- If DateDiff("s", strDt, f.DateLastModified) > 0 Then
- Set objFile = fso.OpentextFile(f, 1)
- txt = objFile.ReadAll
- If TestKeyWord(txt) Then s = s & f.Name & vbCrLf
- objFile.Close
- End If
- End If
- Next
- fso.OpenTextFile("a.txt", 2, true).Write s
- CreateObject("WScript.Shell").Run "cmd /c ""ch.bat""",,true ''调用bat
- Set fso = Nothing
- End Sub
-
- Function TestKeyWord(ByVal txt)
- Dim i
- TestKeyWord = True
- txt = vbCrLf & txt & vbCrLf
- For i = 0 to UBound(arrKey)
- If InStr(txt, vbCrLf & arrKey(i) & vbCrLf) = 0 Then
- TestKeyWord = False : Exit For
- End If
- Next
- End Function
复制代码
作者: syqh2010 时间: 2015-3-6 18:47
谢谢你!
请问是保存为bat,还是vbs。
另如何在循环哪里加如调用ch.bat,谢谢!
作者: apang 时间: 2015-3-6 19:50
本帖最后由 apang 于 2015-3-6 19:52 编辑
回复 18# syqh2010
已修改。保存为Test.vbs
注意每个关键字在文本中各占一行,前后不能包含空格,区分大小写
作者: syqh2010 时间: 2015-3-7 08:19
回复 17# apang
谢谢,你的代码完全符合我的要求,也很快。
但我的描述欠考虑,时间一直叠加,最终会大于当前时间,那时问题就来了。
请帮忙改为和当前的时间判断。
strDT=now()??
谢谢!
作者: apang 时间: 2015-3-7 16:19
回复 20# syqh2010
最后一次修改
以后提问之前请务必想清楚了再提问,像这样不仅浪费了你的时间,也浪费别人不少的时间。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |