标题: [文本处理] [已解决]另外一个帖子,批处理如何在XML内查找内容,显示查找到的内容及后面8个字符? [打印本页]
作者: Bonnie 时间: 2022-11-13 12:36 标题: [已解决]另外一个帖子,批处理如何在XML内查找内容,显示查找到的内容及后面8个字符?
本帖最后由 Bonnie 于 2022-11-14 16:09 编辑
- <# :
- cls&echo off&cd /d "%~dp0"&rem 编码ANSI
- set "tmpfile=%tmp%\t.t"
- powershell -NoProfile -ExecutionPolicy bypass "[IO.File]::ReadAllText(\"%~f0\",[Text.Encoding]::GetEncoding('GB2312'))|Invoke-Expression"
- for /f "tokens=1* delims=|" %%a in ('type "%tmpfile%"') do (
-
- findstr /s /m "3101DF05" "%%a\*.xml"
- )
- pause
- exit
- #>
- $folder="C:\oud\traces";
- $subfolder=@("AC","ADS","AP");
- [System.Collections.ArrayList]$fdlist=@();
- for($i=0;$i -lt $subfolder.length;$i++){
- $fd=$folder+'\'+$subfolder[$i];
- if(test-path -literal $fd){
- $folders=@(dir -literal $fd|?{$_ -is [System.IO.DirectoryInfo]});
- for($j=0;$j -lt $folders.length;$j++){
- [void]$fdlist.add($folders[$j]);
- }
- }
- }
- $tmpfile=$env:tmpfile;[System.Collections.ArrayList]$s=@();
- $newfolder=($env:USERPROFILE)+'\Desktop\'+(get-date).ToString('yyyyMMdd_HHmm')+'';
- if($fdlist.count -ge 1){
- $arr=@($fdlist|sort {$_.CreationTime} -Descending);
- write-host ('['+$arr[0].CreationTime.ToString('yyyy-MM-dd HH:mm:ss')+']'+$arr[0].FullName);
- [void]$s.add($arr[0].FullName+'|'+$newfolder);
- }
- [void]$s.add('C:\AWRoot\dtwr\stcapi\home\temp|'+$newfolder);
- [IO.File]::WriteAllLines($tmpfile, $s, [Text.Encoding]::GetEncoding('GB2312'));
复制代码
这是上面这批处理运行后所显示的内容: 运行所显示出来的是查找3101DF05所在的文件名和路径。
[2022-11-13 10:40:20]C:\oud\traces\AP\637059140efe9889022951
C:\oud\traces\AP\637059140efe9889022951\637059140efe9889022951.TU.20221113-104020.xml
请按任意键继续. . .
我想达到的效果是运行后所显示的第二行文件名及路径这个文件里面的3101DF05及后面的8个字符。
大概说一下代码里面的内容:在C:\oud\traces目前下的AC、ADS、AP三个文件夹内寻找最新时间创建的文件夹。
在最新时间创建的文件夹下查找XML文件里所包含的字符"3101DF05”。
(把C:\oud\traces下最新创建的乱码文件夹下的所有文件及C:\AWRoot\dtwr\stcapi\home\temp下所有的文件,复制到在当前桌面创建一个当前日期和时间的文件夹内。)
注:括号内的功能我不需要了。。另外一个程序需要用到。
作者: BAT221110 时间: 2022-11-13 12:48
可以给个文件做测试吗?
作者: Bonnie 时间: 2022-11-13 12:55
可以给个文件做测试吗?
BAT221110 发表于 2022-11-13 12:48
链接: https://pan.baidu.com/s/1hSo3uTlgs7AOuRE05-RQtA?pwd=57er 提取码: 57er 复制这段内容后打开百度网盘手机App,操作更方便哦
作者: BAT221110 时间: 2022-11-13 14:48
不知道用FINDSTR如何达到这样的效果,我是用正则表达式实现的。
首先,把下面的文件存到OUD.VBS:- FUNCTION READ4(FPATH)
- DIM ADOS
- SET ADOS = CREATEOBJECT("ADODB.STREAM")
-
- WITH ADOS
- .CHARSET = "UTF-8"
- .TYPE = 2
- .OPEN
- .LOADFROMFILE FPATH
- READ4 = .READTEXT
- .CLOSE
- END WITH
- SET ADOS = NOTHING
- END FUNCTION
-
- SUB MAIN4(SEARCH, FPATH)
- DIM REGEX, MATCH, MATCHES
- SET REGEX = NEW REGEXP
- REGEX.PATTERN = SEARCH & "........"
- SET MATCHES = REGEX.EXECUTE(READ4(FPATH))
- WSCRIPT.ECHO MATCHES(0)
- END SUB
-
- MAIN4 WSCRIPT.ARGUMENTS(0), WSCRIPT.ARGUMENTS(1)
复制代码
然后,把原来代码的第7行(findstr)换为:- findstr /s /m "3101DF05" "%%a\*.xml" > OUDTMP12421.TXT
- SET /P DAT=<OUDTMP12421.TXT
- CSCRIPT OUD.VBS //NOLOGO "3101DF05" %DAT%
复制代码
这三行的作用是把原先FINDSTR的输出存到一个临时文件,然后调用VBS。VBS中用正则表达式来提取你要的字符。
作者: Bonnie 时间: 2022-11-13 14:53
回复 4# BAT221110
[2022-11-13 10:40:20]C:\oud\traces\AP\637059140efe9889022951
C:\Users\X230\Desktop\OUD.VBS(24, 1) Microsoft VBScript 运行时错误: 下标越界
C:\Users\X230\Desktop\OUD.VBS(24, 1) Microsoft VBScript 运行时错误: 下标越界
请按任意键继续. . .
运行提示错误。。下标越界
作者: hfxiang 时间: 2022-11-13 15:15
下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )后,执行:- gawk "/3101DF05.{8}/{print gensub(/^.*(3101DF05.{8}).*$/,\"\\1\",\"g\")}" 637059140efe9889022951.TU.20221113-104020.xml>out.txt
复制代码
结果(out.txt)复制代码
作者: BAT221110 时间: 2022-11-13 15:27
本帖最后由 BAT221110 于 2022-11-13 15:30 编辑
我用压缩包测试时可以的。可能是用单个文件测试通过,多个文件要稍微改动下。楼上用GAWK的方法更好。
作者: aloha20200628 时间: 2022-11-13 19:00
本帖最后由 aloha20200628 于 2022-11-14 16:58 编辑
- @echo off
- set "inF=C:\oud\traces\AP\637059140efe9889022951\637059140efe9889022951.TU.20221113-104020.xml"
- set "p=3101df05" &setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('findstr /i /r "%p%........" "%inF%" ') do (
- set "s=%%a" & set "s1=!s:*%p%=!"
- echo,%p%!s1:~,8!
- )
- endlocal &exit/b
复制代码
作者: BAT221110 时间: 2022-11-13 19:21
aloha20200628 发表于 2022-11-13 19:00
这个方法厉害!
作者: Bonnie 时间: 2022-11-14 09:06
aloha20200628 发表于 2022-11-13 19:00
方法是很好用。但是这个文件名不是固定的:
C:\oud\traces\AP\637059140efe9889022951\637059140efe9889022951.TU.20221113-104020.xml
有时候是在C:\oud\traces\AC\下。有时是在C:\oud\traces\ADS\下。
程序会在这个目录下C:\oud\traces\自动生成文件夹。。要在AC或AP或ADS文件夹下寻找最新创建的文件夹。
作者: terse 时间: 2022-11-14 10:28
你dir加个参数吧 最新时间出来了 直接FINDSTR
作者: aloha20200628 时间: 2022-11-14 10:51
本帖最后由 aloha20200628 于 2022-11-14 16:59 编辑
备注》dir **中的 /o-d /tw 是按文件修改时间排序,/o-d /tc是按文件创建时间排序- (dir/s/b/a-d/o-d/tw C:\oud\traces\*.xml)>tmp.txt&(set/p inF=<tmp.txt)&(del/q tmp.txt)
-
- set "p=3101df05" &setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('findstr /i /r "%p%........" "%inF%" ') do (
- set "s=%%a" & set "s1=!s:*%p%=!"
- echo,%p%!s1:~,8!
- )
- endlocal &exit/b
复制代码
作者: Bonnie 时间: 2022-11-14 12:25
备注》dir **中的 /o-d /tw 是按文件修改时间排序,/o-d /tc是按文件创建时间排序
aloha20200628 发表于 2022-11-14 10:51
C:\Users\X230\Desktop>(dir/s/b/a-d/o-d/tw C:\oud\traces\*.xml ) 1>tmp.txt & (set/p inF= 0<tmp.txt ) & (del/q tmp.txt )
C:\Users\X230\Desktop>set "p=3101DF05" & setlocal enabledelayedexpansion
C:\Users\X230\Desktop>for /F "delims=" %a in ('findstr /r "3101DF05........" "C:\oud\traces\AP\637059140efe9889022951\637059140efe9889022951.TU.20221113-104020.xml" ') do (set "s=%a" & set "s1=!s:*3101DF05=!"
echo,3101DF05!s1:~,8! )
C:\Users\X230\Desktop>endlocal & pause & exit/b
请按任意键继续. . .
大神,你好!好像 do动作没有运行。。。
作者: aloha20200628 时间: 2022-11-14 16:50
刚下载了lz的样本文件,才知其中‘给CMD埋了个大坑’,目标字段‘3101DF05...’所在行的字符量=70680,远超过纯P单个变量的上限(8k),for (...) 和 set ... 根本扛不住findstr的返回值。如此本贴须请其他脚本代劳了。
再给一个cmd+cscript@js混编代码》
还是先用 dir /s/b/a-d/o-d/tw 获取指定目录下最新创建或修改的目标文件- @set @v=1 /*
- @echo off
- (dir/s/b/a-d/o-d/tw C:\oud\traces\*.xml)>tmp.txt&(set/p inF=<tmp.txt)&(del/q tmp.txt)
- for /f "delims=" %%v in ('cscript /e:jscript "%~f0" "%inF%" ') do echo,%%v
- exit/b
- */
- var v = WSH.Arguments;
- var fso = new ActiveXObject('scripting.filesystemobject');
- var fp = fso.opentextfile(v(0));
- var alllines = fp.readall(); fp.Close();
- alllines = alllines.replace(/[\r\n]/g, '');
- var kwF = alllines.replace(/.*(3101DF05.{8}).*/gi, '$1');
- WSH.Echo(kwF);
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |