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

【已解决】20元求助-批处理按照文件内容移动文件

E:\duanwenxue文件夹下面有很多子文件夹。
有几十万html,大多数html源代码有一句
<div class="breadcrumb">当前位置:<a href='/'>短篇原创文学</a>><a href='/yuju/'>经典语句</a>><a href='/yuju/yulu/'>经典语录</a>>文章内容</div>

我想,提取所有文件名以及它的这一句,然后,如果文件已经在文件夹路径(比如E:\duanwenxue\yuju\yulu\新建文件夹,或者任何名称的三级或四级子文件夹)下面,就不动。不然移动文件到该路径(这里是E:\duanwenxue\yuju\yulu\)。移动如果与目的地文件重名,就删除文件。

如果源代码没有这一句,就忽略。如果多于一句,也忽略(有些合并的html)。如果这里代码只有一级就放在一级。比如没有yulu,只有yuju。

本帖最后由 WHY 于 2018-11-12 11:25 编辑

分两个脚本,第一个脚本 test.bat,第二个脚本 test.ps1,
两个脚本存放于 E:\duanwenxue 目录下。
双击 test.bat 运行。
Test.bat
  1. @echo off
  2. PowerShell -exec ByPass -f Test.ps1
  3. pause
复制代码
Test.ps1
  1. $reg = '(?i)<div class="(?:sigle-)?breadcrumb">当前位置:\s*<a href=''/''>短篇原创文学</a>>.*<a href=''/([^'']+)/''>[^<>]*</a>';
  2. $MyPath = $MyInvocation.MyCommand.Path -replace '[^\\]+$';
  3. ForEach ($file In (dir -Literal $MyPath -Filter *.html -Recurse)) {
  4.     $s = [IO.File]::ReadAllText($file.FullName, [Text.Encoding]::Default);
  5.     $m = [regex]::Matches($s, $reg);
  6.     $arr = @($m | %{$_.Groups[1].Value});
  7.     If ($arr.Count -ne 1) { continue; }
  8.     $fd = $MyPath + ($arr[0] -replace '/', '\');
  9.     If ($file.FullName -NotLike ($fd + '\*')) {
  10.         If (!(Test-Path -Literal $fd)) { $null = md $fd; }
  11.         move -Literal $file.FullName -Dest $fd -Force;
  12.     }
  13. }
复制代码
看了下,短文周刊 网页不太一样,多了个 “sigle-”。
1

评分人数

TOP

有些二级不是“经典语句”,可以吗?

TOP

回复 3# lxh623


    请举例说明:有些二级不是“经典语句”

TOP

本帖最后由 lxh623 于 2018-11-9 19:16 编辑

东西来自于网站,www.duanwenxue.com/
我的同级文件夹有二三十个,biaoyu、diary、duanju、duanwen、duanxin、gushi、huayu、jingdian、jingdianyulu、jingpin、jingxuan、juzi、kouhao、mingyan、qianming、qinggan、raokouling、rizhi、sanwen、shanggan、shige、wangming、yanjianggao、yuju、yulu、zhengwen、zhoukan、zuowen 。网址加上这些,可以访问。
麻烦您!

TOP

保存到E:\duanwenxue\moveFiles.js
  1. var fso = new ActiveXObject('Scripting.FileSystemObject'),
  2.     shell = new ActiveXObject('WScript.Shell'),
  3.     curDir,
  4.     sSearch = '<div class="breadcrumb">当前位置:<a href=\'/\'>短篇原创文学</a>.*</div>',
  5.     findstrStringFile = 'SearchStrings.txt',
  6.     findstrResultFile = 'SearchResult.txt',
  7.     logFile = 'moveHtml.log',
  8.     ts,
  9.     tsLog,
  10.     nExitCode,
  11.     sPrevFile,
  12.     sPrevDestFolder,
  13.     sCurrFile,
  14.     aFilePath,
  15.     nMultiCount,
  16.     reFilePath = /^([^:]+):<div class="breadcrumb">当前位置:(?=<a href='\/'>短篇原创文学<\/a>>)(?:<a href='([^']+)'>[^<]+<\/a>>)+[^<]+<\/div>/i;
  17. curDir = shell.CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
  18. try {
  19.     tsLog = fso.OpenTextFile(logFile, 8, true, -2);
  20.     tsLog.WriteLine(new Date().toLocaleString());
  21. } catch (e) {
  22.     WScript.Quit(11);
  23. }
  24. try {
  25.     ts = fso.OpenTextFile(findstrStringFile, 2, true, -2);
  26.     ts.WriteLine(sSearch);
  27.     ts.Close();
  28. } catch (e) {
  29.     WScript.Quit(12);
  30. }
  31. shell.Run('%comspec% /c "pushd "' + curDir + '"&findstr.exe /irsg:"' + findstrStringFile + '" *.html >"' + findstrResultFile + '""', 0, true);
  32. try {
  33.     ts = fso.OpenTextFile(findstrResultFile, 1, false, -2);
  34. } catch (e) {
  35.     WScript.Quit(13);
  36. }
  37. sPrevFile = '';
  38. nMultiCount = NaN;
  39. sPrevDestFolder = curDir;
  40. while (!ts.AtEndOfStream) {
  41.     aFilePath = ts.ReadLine().match(reFilePath);
  42.     if (!aFilePath) continue;
  43.     sCurrFile = aFilePath[1];
  44.     if (sCurrFile === sPrevFile) {
  45.         nMultiCount += 1;
  46.     } else {
  47.         if (nMultiCount === 0) {
  48.             if (!fso.FolderExists(sPrevDestFolder)) {
  49.                 shell.Run('%comspec% /c md "' + sPrevDestFolder + '"', 0, true)
  50.             }
  51.             if (!fso.FileExists(sPrevDestFolder + '\\' + sPrevFile.replace(/.*\\/, ''))) {
  52.                 try {
  53.                     // fso.CopyFile(sPrevFile, sPrevDestFolder + '\\', false);
  54.                     // fso.DeleteFile(sPrevFile, true);
  55.                     fso.MoveFile(sPrevFile, sPrevDestFolder + '\\');
  56.                 } catch (e) {
  57.                     tsLog.WriteLine('Moveing ' + sPrevFile + ' failed.');
  58.                 }
  59.             }
  60.         } else {
  61.             nMultiCount = 0;
  62.         }
  63.         sPrevFile = sCurrFile;
  64.         sPrevDestFolder = fso.GetAbsolutePathName('.' + aFilePath[2]);
  65.     }
  66. }
  67. if (nMultiCount === 0) {
  68.     if (!fso.FolderExists(sPrevDestFolder)) {
  69.         shell.Run('%comspec% /c md "' + sPrevDestFolder + '"', 0, true)
  70.     }
  71.     if (!fso.FileExists(sPrevDestFolder + '\\' + sPrevFile.replace(/.*\\/, ''))) {
  72.         try {
  73.             // fso.CopyFile(sPrevFile, sPrevDestFolder + '\\', false);
  74.             // fso.DeleteFile(sPrevFile, true);
  75.             fso.MoveFile(sPrevFile, sPrevDestFolder + '\\');
  76.         } catch (e) {
  77.             tsLog.WriteLine('Moveing ' + sPrevFile + ' failed.');
  78.         }
  79.     }
  80. }
  81. ts.Close();
  82. tsLog.Close();
  83. fso.DeleteFile(findstrStringFile);
  84. fso.DeleteFile(findstrResultFile);
  85. WScript.Echo('Done');
  86. WScript.Quit(0);
复制代码

TOP

回复 3# lxh623


    2楼 Test.ps1 第一行改成:
  1. $reg = '(?i)<div class="breadcrumb">当前位置:<a href=''/''>短篇原创文学</a>><a href=''/[^'']+''>[^<>]*</a>><a href=''(/[^'']+)''>[^<>]*</a>>';
复制代码
试下。

TOP

本帖最后由 lxh623 于 2018-11-10 09:10 编辑

回复 6# flashercs
这个也是移动了很多,创建了不少新的文件夹,非常感谢。
有一个问题,有些四级五级目录的文件夹下文件没有移动。比如,E:\duanwenxue\gushi\guigushi\新建文件夹1 。

TOP

回复 8# lxh623
肯定是目标目录下已经存在同名文件了,本着 不删除 不覆盖 的原则操作,比较安全.
自己查看下目标目录就知道.

TOP

回复 8# lxh623


    你这与顶楼描述的自相矛盾:
(比如E:\duanwenxue\yuju\yulu\新建文件夹,或者任何名称的三级或四级子文件夹)下面,就不动


2楼改了下。

TOP

回复 10# WHY
不是的,是应该移动的没有被移动。

TOP

谢谢两位,大体可以了。

TOP

返回列表