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

【已解决】10元求批处理提取合并文本

E:\duanwenxue\WENZANG和E:\duanwenxue\shige下面有不少三级四级五级文件夹(有些可能没有文本文件)。
我想把每一个文本文件提取特征字符之间的内容,并合并每一个文件夹为一个文本,名字就是文件夹名。只合并到当前级别,批处理出来的文本不再合并。
前特征字符是“>文章内容”,后特征字符是“短文学微信号:duanwenxuewang”,最后不包括特征字符。原文本其他内容不动。
谢谢!

test.bat
保存到 E:\duanwenxue 目录下,双击运行。
  1. @echo off
  2. PowerShell "dir -Literal '%~dp0' -Filter *.txt -Recurse|group DirectoryName|%%{$name=$_.Name -replace '.*\\([^\\]+)$','$1.Log';$arr=$_.Group|%%{$m=[IO.File]::ReadAllText($_.FullName,[Text.Encoding]::Default) -match '(?<=>文章内容)[\s\S]*(?=短文学微信号:duanwenxuewang)';If($m){$matches[0]}};sc -Literal ('%~dp0'+$name) -Value $arr}"
  3. pause
复制代码
1

评分人数

    • lxh623: 谢谢!请查收。技术 + 1

TOP

本帖最后由 yhcfsr 于 2018-11-16 21:04 编辑

保存为BAT,放在母目录执行.
这里的多级目录是按全路径来计算的,也就是说E:\duanwenxue是一级目录
  1. @set @n=0/*&echo off
  2. dir /ad/s/b|cscript -nologo -e:jscript "%~f0"
  3. pause&exit /b */
  4. var fso=new ActiveXObject('scripting.FileSystemObject');
  5. var re_prefix=new RegExp(">文章内容","gim");
  6. var re_suffix=new RegExp("短文学微信号:duanwenxuewang","gim");
  7. while(!WSH.StdIn.AtEndOfStream)
  8. {
  9.     dir=WSH.StdIn.ReadLine();
  10.     var count=0;
  11.     dir.replace(/\\/g,function (){
  12.         count++;
  13.     });
  14.     if(count<3||count>5) continue;
  15.     getFiles(fso,dir);
  16. }
  17. //目录下文件   
  18. function getFiles(fso,spDir){
  19. var fd=fso.GetFolder(spDir);
  20.     var curDir=spDir.replace(/.*\\([^\\]*)/gi,'$1');
  21.     var out   =spDir.replace(/\\/gi,'/')+'/'+curDir+'.txt';
  22. var fc=new Enumerator(fd.files);
  23.     var result='';
  24. for(;!fc.atEnd();fc.moveNext())   
  25. {   
  26. file=fc.item();
  27.         ext=file.replace(/.*\\[^\\]*?([^.]*)$/,'$1');
  28.         if(ext!='txt') continue;
  29.         fo=fso.OpenTextFile(file,1);
  30.         var flag=0;
  31.         while(!fo.AtEndOfStream)
  32.         {
  33.             line=fo.ReadLine();
  34.             if(!line||line.match(/^\s+$/)) continue;
  35.             if (line.match(re_suffix)) break;
  36.             if(flag==1) result+=line+'\r\n';
  37.             if(line.match(re_prefix)) flag=1;
  38.         }
  39.         fo.close();
  40.         result+='\r\n';
  41. }
  42.     fo=fso.OpenTextFile(out,2,true);
  43.     fo.Write(result);
  44.     fo.close();
  45. }
复制代码
1

评分人数

QQ 33892006

TOP

返回列表