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

[文件操作] 批处理脚本无法处理并重命名包含表情符号的文件夹

[复制链接]
发表于 2025-5-11 12:58:31 | 显示全部楼层 |阅读模式
  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. rem 排除特定文件(000,00.1,00.2,00.3,00.4),不需要可以删除下一行
  5. set "_f=^|findstr /rvix /c:"00\.[123]\.[jpb][pnm][gp]" /c:"000\.[jpb][pnm][gp]""

  6. (for /f "delims=" %%d in ('dir /b /ad') do (
  7.         setlocal
  8.         pushd "%%d"
  9.         if not errorlevel 1 (
  10.                 for /f %%a in ('dir /b /a-d *.jpg *.jpeg *.heic *.png *.bmp *.gif %_f% ^|find /c /v ""') do (
  11.                         set /a "1/%%a" && set P=%%aP
  12.                 )
  13.                 for /f %%a in ('dir /b /a-d *.mp4 *.avi *.mov *.mkv ^|find /c /v ""') do (
  14.                         set /a "1/%%a" && set V=%%aV
  15.                 )
  16.                 set m=1048576
  17.                 for /f "eol=0tokens=3" %%j in ('dir /s /a-d /-c *.jpg *.jpeg *.heic *.png *.bmp *.gif *.mp4 *.avi *.mov *.mkv 2^>nul^| findstr /i "个文件.*字节$"') do (
  18.                         set size=%%j00
  19.                         setlocal enabledelayedexpansion
  20.                         if !size! geq 102400 (
  21.                                 if !size! geq 104857600 (
  22.                                         set s=MB
  23.                                         set t=!size!
  24.                                         set len=!t:~9!098765432100
  25.                                         set /alen=9+!len:~10,1!
  26.                                         set/a "r=!t:~,8!%%m,size=!t:~,8!/m"
  27.                                         for /l %%j in (9 1 !len!) do (
  28.                                                 set/a "q=!r!!t:~%%j,1!/m,r=!r!!t:~%%j,1!%%m"
  29.                                                 set "size=!size!!q!"
  30.                                         )
  31.                                         if !size! geq 102400 set s=GB&set /asize/=1024
  32.                                 ) else set s=KB&set /asize/=1024
  33.                         ) else set s=Byte
  34.                         for /f "tokens=1-3" %%a in ("!size:~,-2! !size:~-2! !s!") do (
  35.                                 endlocal
  36.                                 set Z=%%a.%%b%%c
  37.                         )
  38.                 )
  39.                 popd
  40.                 if defined Z (
  41.                         call ren "%%d" "%%d [%%p%%%%V%%-%%Z%%]"
  42.                 )
  43.         )
  44.         endlocal
  45. )) 2>nul
  46. pause
复制代码
上面这段bat代码的功能是批量遍历当前目录下的所有子文件夹,为每个子文件夹重命名,添加图片数量、视频数量以及总文件大小的标记,但是我发现如果一个文件夹包含诸如❤️🐾表情符号时,重命名就会失效,想知道问题在哪儿,以及如何解决,拜托各位大佬了
发表于 2025-5-11 16:58:18 | 显示全部楼层
第42行改成:
  1. call ren "%%~fd" "%%~nxd [%%p%%%%V%%-%%Z%%]"
复制代码

评分

参与人数 1技术 +1 收起 理由
walkercolin + 1 感谢给帖子标题标注[已解决]字样

查看全部评分

 楼主| 发表于 2025-5-11 17:16:58 | 显示全部楼层
回复 2# buyiyang
谢谢,可以了,虽然我不懂,但还是想问一下这是为什么呢
发表于 2025-5-11 17:19:26 | 显示全部楼层
正常 , 当前代码页无法表示的字符会在
(for /f "delims=" %%d in ('dir /b /ad') do (
这句后变成?符号 ,表情符号只能在65001代码页下才能表示
虽然可以在前面加上chcp 65001切换代码页 , 但是findstr不支持utf8
虽然可以改成for /d ,但是可能出现重复改名的问题
虽然可以改成for /d将路径存在变量里 ,但是麻烦 ,而且数量有上限
自己看着办吧 ,建议不要用bat
发表于 2025-5-11 18:30:49 | 显示全部楼层
回复 3# walkercolin


    是否使用变量增强扩展的区别,使用变量增强扩展会直接用GetFullPathName获取路径变量。
发表于 2025-5-11 22:35:37 | 显示全部楼层
无法表示的字符转换成?号后能工作 ,是因为被当成了通配符 ,由于通配顺序或结果是可能会出问题的

评分

参与人数 2技术 +2 收起 理由
77七 + 1 感谢分享
buyiyang + 1 严谨

查看全部评分

发表于 2025-5-11 22:43:43 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-5-13 21:30 编辑

回复 1# walkercolin

仅用批处代码计算大文件或多文件尺寸很容易出错(难以累加超过2GB的文件尺寸,且没有内置小数计算功能),以下代码调用 powershell 完成大数及小数计算和单位(kb/mb/gb)格式化功能(可用代码第7行 {0:n2} 其中的第二个数值调整小数位数,预设2位),代码存为 test.bat 与图片和视频文件同目录运行... 仅供参考

  1. @echo off & for /f "delims=" %%d in ('dir/b/s/ad^|sort /r') do (
  2.   pushd "%%d" && for /f %%p in ('dir /b/a-d *.jpg *.jpeg *.heic *.png *.bmp *.gif ^|find /c /v "" '
  3. ) do for /f %%v in ('dir /b/a-d *.mp4 *.avi *.mov *.mkv ^|find /c /v "" '
  4. ) do for /f "tokens=3 delims= " %%z in (
  5.   'dir /a-d/-c *.jpg *.jpeg *.heic *.png *.bmp *.gif *.mp4 *.avi *.mov *.mkv ^|findstr /c:" 个文件 " '
  6. ) do for /f "delims=" %%z in (
  7.   'powershell "$n,$z=0,%%z;while($z/1024 -gt 1){$z/=1024;$n++};$u=('B','KB','MB','GB')[$n];('{0:n2}' -f $z)+$u" '
  8. ) do popd && ren "%%~fd" "%%~nd [%%pP%%vV-%%z]%%~xd")
  9. pause&exit/b
复制代码
发表于 2025-5-11 23:26:17 | 显示全部楼层
回复 6# Five66


    之前还在想GetFullPathName是怎么搜索到的,这下就讲得通了。
发表于 2025-5-12 22:45:00 | 显示全部楼层
1楼代码
第18行改为
  1.                 for /f "eol=0tokens=3" %%j in ('dir /s /a-d /-c *.jpg *.jpeg *.heic *.png *.bmp *.gif *.mp4 *.avi *.mov *.mkv 2^>nul^| findstr /i "File(s).*[0-9][0-9]*.*bytes$"') do (
复制代码



第2行改为
  1. chcp 65001 >nul
复制代码


且批处理保存为utf-8编码格式
 楼主| 发表于 2025-5-13 07:32:43 | 显示全部楼层
回复 9# 77七
第二行?第二行不是注释吗?
发表于 2025-5-13 13:01:17 | 显示全部楼层
回复 1# walkercolin

用几个尺寸值复算了一楼代码中第19-39行的运行结果,如下:
如入口 %%j 值设为 1234567,则出口 %z% 值为 1205.63GB 准确值应约为 1.17MB
如入口 %%j 值设为 12345678,则出口 %z% 值为 12056.32GB 准确值应约为 11.77MB
如入口 %%j 值设为 123456789,则出口 %z% 值为 20971.51GB 准确值应约为 117.73MB
如入口 %%j 值设为 1234567890,则出口 %z% 值为 20971.51GB 准确值应约为 1.14GB
发表于 2025-5-13 13:39:34 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-5-13 13:40 编辑


   一楼代码没有读写外部文本文件,且第18行中的字面量数据只包含几个简体中文字符,在默认码页(936)下用 findstr 匹配应该没问题(实测结果也确实没问题),可以不切换默认码页。
   楼主所说的更名无效问题,主要是一楼代码第42行 ren 的首参未用全路径(因 popd 之后被更名的当前目录已被实时修改)。
   至于含有怪异字符(也包括&字符)的路径文件名,只要被双引号包裹,如 ren 等系统命令对之均可妥善处理,在命令行手试即知结果...
发表于 2025-5-13 15:38:26 | 显示全部楼层
本帖最后由 buyiyang 于 2025-5-13 15:46 编辑

回复 12# aloha20200628
不是全路径的问题。
在936代码页下,for通过管道接收dir列出的文件夹名,经过管道转码后无法识别的部分unicode字符字节就变成?字符了。
使用普通变量则直接获取接受的文件夹名,含有的问号导致ren命令失效。(虽然ren命令本身支持通配符,但这样用会失败。)而使用变量增强扩展则会在当前目录下根据接收的文件夹名进行搜索操作获得确定的名称,才能正确执行ren命令。
根据楼上的提醒,其中的问号?在上述搜索中会被作为通配符匹配,有时可能匹配不当。
发表于 2025-5-13 19:28:25 | 显示全部楼层
回复 10# walkercolin


     修改后原注释是矛盾的,恰好需要添加一行改变代码页,所以直接把第2行改了就行。
发表于 2025-5-13 19:31:02 | 显示全部楼层
回复 11# aloha20200628


   大佬,还有个17行,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:29 , Processed in 0.024631 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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