标题: 【已解决】20元求助-批处理按照文件内容移动文件 [打印本页]
作者: lxh623 时间: 2018-11-9 09:57 标题: 【已解决】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-9 14:05
本帖最后由 WHY 于 2018-11-12 11:25 编辑
分两个脚本,第一个脚本 test.bat,第二个脚本 test.ps1,
两个脚本存放于 E:\duanwenxue 目录下。
双击 test.bat 运行。
Test.bat- @echo off
- PowerShell -exec ByPass -f Test.ps1
- pause
复制代码
Test.ps1- $reg = '(?i)<div class="(?:sigle-)?breadcrumb">当前位置:\s*<a href=''/''>短篇原创文学</a>>.*<a href=''/([^'']+)/''>[^<>]*</a>';
- $MyPath = $MyInvocation.MyCommand.Path -replace '[^\\]+$';
-
- ForEach ($file In (dir -Literal $MyPath -Filter *.html -Recurse)) {
- $s = [IO.File]::ReadAllText($file.FullName, [Text.Encoding]::Default);
- $m = [regex]::Matches($s, $reg);
- $arr = @($m | %{$_.Groups[1].Value});
- If ($arr.Count -ne 1) { continue; }
- $fd = $MyPath + ($arr[0] -replace '/', '\');
- If ($file.FullName -NotLike ($fd + '\*')) {
- If (!(Test-Path -Literal $fd)) { $null = md $fd; }
- move -Literal $file.FullName -Dest $fd -Force;
- }
- }
复制代码
看了下,短文周刊 网页不太一样,多了个 “sigle-”。
作者: lxh623 时间: 2018-11-9 14:40
有些二级不是“经典语句”,可以吗?
作者: WHY 时间: 2018-11-9 15:08
回复 3# lxh623
请举例说明:有些二级不是“经典语句”
作者: lxh623 时间: 2018-11-9 19:11
本帖最后由 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 。网址加上这些,可以访问。
麻烦您!
作者: flashercs 时间: 2018-11-9 20:06
保存到E:\duanwenxue\moveFiles.js- var fso = new ActiveXObject('Scripting.FileSystemObject'),
- shell = new ActiveXObject('WScript.Shell'),
- curDir,
- sSearch = '<div class="breadcrumb">当前位置:<a href=\'/\'>短篇原创文学</a>.*</div>',
- findstrStringFile = 'SearchStrings.txt',
- findstrResultFile = 'SearchResult.txt',
- logFile = 'moveHtml.log',
- ts,
- tsLog,
- nExitCode,
- sPrevFile,
- sPrevDestFolder,
- sCurrFile,
- aFilePath,
- nMultiCount,
- reFilePath = /^([^:]+):<div class="breadcrumb">当前位置:(?=<a href='\/'>短篇原创文学<\/a>>)(?:<a href='([^']+)'>[^<]+<\/a>>)+[^<]+<\/div>/i;
- curDir = shell.CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
- try {
- tsLog = fso.OpenTextFile(logFile, 8, true, -2);
- tsLog.WriteLine(new Date().toLocaleString());
- } catch (e) {
- WScript.Quit(11);
- }
- try {
- ts = fso.OpenTextFile(findstrStringFile, 2, true, -2);
- ts.WriteLine(sSearch);
- ts.Close();
- } catch (e) {
- WScript.Quit(12);
- }
- shell.Run('%comspec% /c "pushd "' + curDir + '"&findstr.exe /irsg:"' + findstrStringFile + '" *.html >"' + findstrResultFile + '""', 0, true);
- try {
- ts = fso.OpenTextFile(findstrResultFile, 1, false, -2);
- } catch (e) {
- WScript.Quit(13);
- }
- sPrevFile = '';
- nMultiCount = NaN;
- sPrevDestFolder = curDir;
- while (!ts.AtEndOfStream) {
- aFilePath = ts.ReadLine().match(reFilePath);
- if (!aFilePath) continue;
- sCurrFile = aFilePath[1];
- if (sCurrFile === sPrevFile) {
- nMultiCount += 1;
- } else {
- if (nMultiCount === 0) {
- if (!fso.FolderExists(sPrevDestFolder)) {
- shell.Run('%comspec% /c md "' + sPrevDestFolder + '"', 0, true)
- }
- if (!fso.FileExists(sPrevDestFolder + '\\' + sPrevFile.replace(/.*\\/, ''))) {
- try {
- // fso.CopyFile(sPrevFile, sPrevDestFolder + '\\', false);
- // fso.DeleteFile(sPrevFile, true);
- fso.MoveFile(sPrevFile, sPrevDestFolder + '\\');
- } catch (e) {
- tsLog.WriteLine('Moveing ' + sPrevFile + ' failed.');
- }
- }
- } else {
- nMultiCount = 0;
- }
- sPrevFile = sCurrFile;
- sPrevDestFolder = fso.GetAbsolutePathName('.' + aFilePath[2]);
- }
- }
- if (nMultiCount === 0) {
- if (!fso.FolderExists(sPrevDestFolder)) {
- shell.Run('%comspec% /c md "' + sPrevDestFolder + '"', 0, true)
- }
- if (!fso.FileExists(sPrevDestFolder + '\\' + sPrevFile.replace(/.*\\/, ''))) {
- try {
- // fso.CopyFile(sPrevFile, sPrevDestFolder + '\\', false);
- // fso.DeleteFile(sPrevFile, true);
- fso.MoveFile(sPrevFile, sPrevDestFolder + '\\');
- } catch (e) {
- tsLog.WriteLine('Moveing ' + sPrevFile + ' failed.');
- }
- }
- }
- ts.Close();
- tsLog.Close();
- fso.DeleteFile(findstrStringFile);
- fso.DeleteFile(findstrResultFile);
- WScript.Echo('Done');
- WScript.Quit(0);
复制代码
作者: WHY 时间: 2018-11-9 21:27
回复 3# lxh623
2楼 Test.ps1 第一行改成:- $reg = '(?i)<div class="breadcrumb">当前位置:<a href=''/''>短篇原创文学</a>><a href=''/[^'']+''>[^<>]*</a>><a href=''(/[^'']+)''>[^<>]*</a>>';
复制代码
试下。
作者: lxh623 时间: 2018-11-10 09:02
本帖最后由 lxh623 于 2018-11-10 09:10 编辑
回复 6# flashercs
这个也是移动了很多,创建了不少新的文件夹,非常感谢。
有一个问题,有些四级五级目录的文件夹下文件没有移动。比如,E:\duanwenxue\gushi\guigushi\新建文件夹1 。
作者: flashercs 时间: 2018-11-10 10:40
回复 8# lxh623
肯定是目标目录下已经存在同名文件了,本着 不删除 不覆盖 的原则操作,比较安全.
自己查看下目标目录就知道.
作者: WHY 时间: 2018-11-10 12:47
回复 8# lxh623
你这与顶楼描述的自相矛盾:
(比如E:\duanwenxue\yuju\yulu\新建文件夹,或者任何名称的三级或四级子文件夹)下面,就不动
2楼改了下。
作者: lxh623 时间: 2018-11-10 14:25
回复 10# WHY
不是的,是应该移动的没有被移动。
作者: lxh623 时间: 2018-11-10 14:37
谢谢两位,大体可以了。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |