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

示例文本很多 Title 行结尾不是以 回车换行(\r\n)结尾,而是以 \r\r\n 结尾
开启变量延迟扩展后,在 set 赋值、截取字符时,多余的回车符 \r 被保留,文件名遇到 \r 导致重命名失败。

把 39 行改成:
  1. if "!m:~0,5!" == "Title" for /f "delims=" %%j in ("!n:~0,-4!_!m:~7!") do ren "%F2%\%%a" "%%j.txt"
复制代码
4

评分人数

TOP

本帖最后由 WHY 于 2018-7-14 20:04 编辑

其实脚本有很大的优化空间,举例:
  1. @echo off
  2. COLOR 1F
  3. set "F1=%~nx1"
  4. set /p F1=请输入源目录:
  5. set "F2=Author"
  6. if not exist "%F2%" md "%F2%"
  7. setlocal enabledelayedexpansion
  8. for /f "delims=" %%a in ('dir /b /a-d "%F1%\*.txt"') do (
  9. for /f "delims=" %%i in ('type "%F1%\%%a"') do (
  10. set "m=%%i"
  11. if "!m:~0,5!" == "Level" (
  12. set /a x=10000 + !m:~5!
  13. echo;>"%F2%\%%~na_!x:~1!.txt"
  14. ) else (
  15. echo;%%i>>"%F2%\%%~na_!x:~1!.txt"
  16. if "!m:~0,5!" == "Title" (
  17. for /f "delims=" %%j in ("!m:~7!") do set "Title=%%j"
  18. ) else if "!m:~0,6!" == "Author" (
  19. set "Author=!m:~8!"
  20. )
  21. )
  22. if defined Title if defined Author (
  23. rem 替换字符
  24. set "NewName=!Author!_%%~na_!x:~1!_!Title!"
  25. set "NewName=!NewName: + =,!"
  26. set "NewName=!NewName: +=,!"
  27. set "NewName=!NewName:+ =,!"
  28. set "NewName=!NewName:+=,!"
  29. set "NewName=!NewName:  =-!"
  30. set "NewName=!NewName: =-!"
  31. set "NewName=!NewName:--=-!"
  32. rem 重命名
  33. ren "%F2%\%%~na_!x:~1!.txt" "!NewName!.txt"
  34. set "Title="
  35. set "Author="
  36. )
  37. )
  38. )
  39. pause & exit
复制代码
test.js
  1. var srcDir = '.';      //源目录
  2. var dstDir = 'Author'; //目标目录
  3. var fso = new ActiveXObject('Scripting.FileSystemObject');
  4. if(!fso.FolderExists(dstDir)) fso.CreateFolder(dstDir);  //创建文件夹
  5. var objFolder = fso.GetFolder(srcDir);
  6. var e = new Enumerator(objFolder.Files);
  7. for(; !e.atEnd(); e.moveNext()){
  8.     var f = e.item();
  9.     if(!/\.txt$/i.test(f.Name)) continue;  //忽略非txt后缀文件
  10.     var baseName = f.Name.replace(/\.txt$/i,'');
  11.     var txt = fso.OpenTextFile(f, 1).ReadAll();  //打开、读取文本
  12.     var arr = txt.split(/[\r\n]+Level(?=\d+)/);  //分割数组
  13.     for(var i=0; i<arr.length; i++) writeToFile(arr[i], baseName);
  14. }
  15. function writeToFile(str, baseName){
  16.     var num = str.match(/^\d+/);    //第一行数字赋值给num
  17.     var author = str.match(/^Author:[^\r\n]+/m);
  18.     var title = str.match(/^Title:[^\r\n]+/m);
  19.     if(num && author && title){
  20.         num = (10000 + num * 1 + '').substr(1);
  21.         var newName = author + '_' + baseName + '_' + num + '_' + title;
  22.         //删除非法文件名字符,删除 Author: 和 Title:字符,替换字符
  23.         newName = newName.replace(/(Author|Title):\s*|[\\/|<>?*":]/g, '').replace(/\s*\+\s*/g, ',').replace(/\s+/g, '-');
  24.             
  25.         str = str.replace(/^[^\r\n]+/, ''); //删除第一行(数字行)
  26.         fso.CreateTextFile(dstDir + '\\' + newName + '.txt', true).writeLine(str); //写入txt文件
  27.     }
  28. }
  29. WSH.Echo('Done');
复制代码
2

评分人数

    • pan528: 谢谢,代码太精彩了!技术 + 1
    • CrLf: 1技术 + 1

TOP

返回列表