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

[文件操作] 【已解决】统计每个TXT文件中【<img】出现的次数,将其加入到每个文件名中。

[复制链接]
发表于 2020-11-4 13:57:28 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2020-11-4 14:00 编辑

由于UTF-8编码的影响,部分双引号也会出现乱码,为保险起见,在15楼代码7、8行之间插入一行   set "str=!str:"=!"    最好。
发表于 2020-11-4 15:18:04 | 显示全部楼层
修改和简化后的完整代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r %%i in ("*.txt") do (
  4.     set n=0
  5.     for /f "delims=" %%a in ('type "%%i"') do (
  6.         set "str=%%a"
  7.         set "str=!str:img alt= <img alt!"
  8.         set "str=!str:"=!"
  9.         for %%k in (!str!) do (
  10.             if "%%k"=="<img" set /a n+=1
  11.         )
  12.     )
  13.     ren "%%i" "%%~ni(共!n!张图片)%%~xi"
  14. )
  15. pause&exit
复制代码
发表于 2020-11-4 19:29:21 | 显示全部楼层
回复 14# 三十年前


    是 sed.exe 不是 set,脚本上面一行有下载链接。
发表于 2020-11-4 19:35:34 | 显示全部楼层
纯批的话,改一下代码页可以避免乱码问题。
  1. @echo off & setlocal enabledelayedexpansion
  2. chcp 65001
  3. for /f "delims=" %%i in ('dir /b /a-d /s *.txt') do (
  4.     set n=0
  5.     for /f "delims=" %%j in ('type "%%i"') do (
  6.         set "s=%%j"
  7.         set "s=!s:"=!"
  8.         for %%k in ("!s:<img=" "!") do set /a n+=1
  9.         set /a n-=1
  10.     )
  11.     echo ren "%%i" "%%~ni(!n!)%%~xi"
  12. )
  13. pause
复制代码
保存为 test.bat,编码格式选 utf-8 without BOM。
Active code page: 65001
ren "E:\Test\需求.txt" "需求(2).txt"
ren "E:\Test\测试文件\怀素《自叙帖》草书书法图片.txt" "怀素《自叙帖》草书书法图片(45).txt"
ren "E:\Test\测试文件\蔡京《大观御笔记》行书欣赏.txt" "蔡京《大观御笔记》行书欣赏(4).txt"
Press any key to continue . . .

评分

参与人数 1技术 +1 收起 理由
qixiaobin0715 + 1 技术

查看全部评分

发表于 2020-11-4 19:43:32 | 显示全部楼层
回复 19# WHY

乱码问题原来可以这样解决,以前不知道,学到了。谢谢!!!
发表于 2020-11-7 09:50:52 | 显示全部楼层
第5行加上findstr过滤一下效率应当能够得到提升:
'type "%%i"^|findstr /c:"img alt"'
发表于 2020-11-10 10:02:33 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2020-11-12 13:17 编辑

练练手,去掉一层for循环,复习一下call的用法,效率差点。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r %%i in ("*.txt") do (
  4.     set n=0
  5.     for /f "delims=" %%a in ('type "%%i"^|findstr /c:"img alt"') do (
  6.         set "str=%%a"
  7. :a
  8.         echo "!str!"|findstr /c:"img alt">nul&&set str=!str:*img alt=!&&set /a n+=1&&call :a
  9.     )
  10.     ren "%%i" "%%~ni(共!n!张图片)%%~xi" 2>nul
  11. )
  12. goto :eof
复制代码
发表于 2020-11-11 22:46:00 | 显示全部楼层
本帖最后由 WHY 于 2020-11-11 22:48 编辑

回复 22# qixiaobin0715


    for 循环内部(语句块内部)应该不能放置标签的吧?可以把 :a 标签放到 for 循环体外面。
发表于 2020-11-11 22:56:36 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2020-11-12 06:50 编辑

回复 23# WHY

通常是不行。这里是特例,call循环完成后会继续完成它下面的代码,中间ren会报错,增加 2>nul消除。内层for循环结束一次(每个文件读取完成)后,会正常执行一次ren。这里是非常规的用法。只是博得一笑而已。
报错原因是无法识别%%i。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 20:28 , Processed in 0.029362 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表