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

[文件操作] [已解决]文件名或路径%^怎么进行正常处理?

[复制链接]
发表于 2025-6-5 10:28:33 | 显示全部楼层 |阅读模式
本帖最后由 1139054012 于 2025-6-5 13:40 编辑

功能是实现了,考虑到各种路径特殊符号【❤★!@#$%^&*()_+等
测试其他都解决了,就差%^不行,自动被识别bat内的指令
没方法了,看论坛大佬能否改成完美版,无论路径和文件夹再怎么用特殊字符,都能完美获取文件名,进行操作
  1. @echo off
  2. chcp 65001 >nul

  3. :: 创建分类目录
  4. mkdir "简体" 2>nul
  5. mkdir "繁体" 2>nul

  6. :: 初始化计数器
  7. set /a success=0, fail=0

  8. :: 第一轮处理:精确匹配_字幕01和_字幕02
  9. for %%e in (ass srt ssa) do (
  10.     for /f "delims=" %%f in ('dir /b /a-d "*_字幕01*.%%e" 2^>nul') do (
  11.         call :safe_move "%%f" "简体" "_字幕01"
  12.     )
  13.     for /f "delims=" %%f in ('dir /b /a-d "*_字幕02*.%%e" 2^>nul') do (
  14.         call :safe_move "%%f" "繁体" "_字幕02"
  15.     )
  16. )

  17. :: 第二轮处理:识别.sc/.tc等后缀
  18. for %%F in (*.ass *.srt *.ssa) do (
  19.     if exist "%%F" (
  20.         setlocal disabledelayedexpansion
  21.         set "filepath=%%F"
  22.         set "filename=%%~nF"
  23.         set "extension=%%~xF"
  24.         
  25.         setlocal enabledelayedexpansion
  26.         set "subtype="
  27.         set "newname="
  28.         
  29.         :: 检测简体后缀
  30.         if "!filename:~-3!"==".sc" (
  31.             set "subtype=sc"
  32.             set "newname=!filename:~0,-3!"
  33.         )
  34.         if not defined subtype if "!filename:~-4!"==".chs" (
  35.             set "subtype=sc"
  36.             set "newname=!filename:~0,-4!"
  37.         )
  38.         if not defined subtype if "!filename:~-5!"==".jpsc" (
  39.             set "subtype=sc"
  40.             set "newname=!filename:~0,-5!"
  41.         )
  42.         
  43.         :: 检测繁体后缀
  44.         if not defined subtype if "!filename:~-3!"==".tc" (
  45.             set "subtype=tc"
  46.             set "newname=!filename:~0,-3!"
  47.         )
  48.         if not defined subtype if "!filename:~-4!"==".cht" (
  49.             set "subtype=tc"
  50.             set "newname=!filename:~0,-4!"
  51.         )
  52.         if not defined subtype if "!filename:~-5!"==".jptc" (
  53.             set "subtype=tc"
  54.             set "newname=!filename:~0,-5!"
  55.         )
  56.         
  57.         :: 处理检测到的后缀类型
  58.         if defined subtype (
  59.             if "!subtype!"=="sc" set "targetdir=简体"
  60.             if "!subtype!"=="tc" set "targetdir=繁体"
  61.             
  62.             set "newpath=!targetdir!\!newname!!extension!"
  63.             move "!filepath!" "!newpath!" >nul 2>&1
  64.             
  65.             if exist "!newpath!" (
  66.                 echo 已移动: !newname!!extension! → !targetdir!\
  67.                 endlocal & endlocal & set /a success+=1
  68.             ) else (
  69.                 echo 移动失败: !filepath!
  70.                 endlocal & endlocal & set /a fail+=1
  71.             )
  72.         ) else (
  73.             endlocal & endlocal
  74.         )
  75.     )
  76. )

  77. :: 显示结果统计
  78. echo.
  79. echo 处理完成!
  80. echo 成功: %success% 个文件
  81. echo 失败: %fail% 个文件
  82. echo 按任意键退出...
  83. pause >nul
  84. exit /b

  85. :: 安全移动函数(处理特殊字符)
  86. :safe_move
  87. setlocal disabledelayedexpansion
  88. set "file=%~1"
  89. set "target=%~2"
  90. set "pattern=%~3"

  91. for %%A in ("%file%") do (
  92.     set "name=%%~nA"
  93.     set "ext=%%~xA"
  94. )

  95. setlocal enabledelayedexpansion
  96. set "newname=!name:%pattern%=!"
  97. set "newpath=!target!\!newname!!ext!"

  98. move "!file!" "!newpath!" >nul 2>&1
  99. if exist "!newpath!" (
  100.     echo 已移动: !newname!!ext! → !target!\
  101.     endlocal & endlocal & set /a success+=1
  102. ) else (
  103.     echo 移动失败: !file!
  104.     endlocal & endlocal & set /a fail+=1
  105. )
  106. exit /b
复制代码
  1. 移动失败: 1^^建_字幕01_chi.txt.ass

  2. 处理完成!
  3. 成功: 0 个文件
  4. '�文件' is not recognized as an internal or external command,
  5. operable program or batch file.
  6. '��键退出...' is not recognized as an internal or external command,
  7. operable program or batch file.




复制代码
文件名随便测试
新!$#%♥♡()【「〖❗:★☆🌟♥_+/_字幕02_chi.ass
发表于 2025-6-5 11:37:35 | 显示全部楼层
  1. set "_字幕01=简体"
  2. set "_字幕02=繁体"
  3. for %%e in (_字幕01 _字幕02) do (
  4.         for /f "delims=" %%f in ('dir /b /a-d "*%%e*.ass" "*%%e*.srt" "*%%e*.ssa" 2^>nul') do (
  5.                 set nx=%%f
  6.                 setlocal enabledelayedexpansion
  7.                 md "!%%e!"
  8.                 move "!nx!" "!%%e!\!nx:%%e=!"
  9.                 endlocal
  10.         )
  11. )
复制代码

有问题再说

评分

参与人数 1技术 +1 收起 理由
1139054012 + 1 666,直接解决

查看全部评分

发表于 2025-6-5 13:28:03 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-6-5 13:32 编辑

回复 1# 1139054012

楼主可先用以下代码覆盖一楼代码第8-115行后(须用utf-8编码存盘)运行,看是否能正确处理名为 "新!$#%♥♡(^)_+_字幕01_chi.ass" 的一类文件(我已调试通过)...

  1. for %%w in ("_字幕01", "_字幕02") do for /f "delims=" %%f in (
  2.   'dir /b/a-d "*%%~w*.ass" "*%%~w*.srt" "*%%~w*.ssa" ') do (
  3.      set "w=%%~w" &set "name=%%~nf" &setlocal enabledelayedexpansion
  4.      set "newname=!name:%%~w=!"
  5.      if !w:~-1! equ 1 (set "newpath=简体\!newname!%%~xf") else (set "newpath=繁体\!newname!%%~xf")
  6.      move /y "!name!%%~xf" "!newpath!" &endlocal
  7. )
  8. exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
1139054012 + 1 乐于助人

查看全部评分

 楼主| 发表于 2025-6-5 13:39:48 | 显示全部楼层
本帖最后由 1139054012 于 2025-6-5 13:41 编辑

回复 3# aloha20200628

感谢回复,测试了下

'C:\!$#%♥♡' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\!$#%♥♡(^)_+_>

我这边不行,我还刻意用特殊文件夹和文件名测试,用楼上的改了下没问题了,就是直接替换计数会失效,需要额外处理下
发表于 2025-6-5 14:33:23 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-6-5 14:37 编辑

回复 4# 1139054012

用3楼代码又测试了当前目录下几个示例文件(接续一楼代码前6行),名如
   "新!$#%♥♡(^)【「〖❗:★☆&#127&775;♥_+/_字幕01_chi.ass"
   "新!$#%♥♡(^)【「〖❗:★☆&#127&775;♥_+/_字幕02_chi.srt"
   "新【❤★!@#$%^&()_+_字幕01_chi.ass"
   "新【❤★!@#$%^&()_+_字幕02_chi.srt"
均予顺利通过,代码改为 ansi(或 gb2312)编码存盘(删除一楼代码第2行)亦可顺利通过...
 楼主| 发表于 2025-6-5 15:32:25 | 显示全部楼层
本帖最后由 1139054012 于 2025-6-5 16:15 编辑

回复 5# aloha20200628


忘加原来代码测试了
发表于 2025-6-5 15:54:04 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-6-5 15:59 编辑

回复 6# 1139054012

测试3楼代码须接续一楼代码前6行,若要直接运行3楼代码则须改用以下版本...

  1. @echo off &md "简体" "繁体" 2>nul
  2. for %%w in ("_字幕01", "_字幕02") do for /f "delims=" %%f in (
  3.   'dir /b/a-d "*%%~w*.ass" "*%%~w*.srt" "*%%~w*.ssa" ') do (
  4.      set "w=%%~w" &set "name=%%~nf" &setlocal enabledelayedexpansion
  5.      set "newname=!name:%%~w=!"
  6.      if !w:~-1! equ 1 (set "newpath=简体\!newname!%%~xf") else (set "newpath=繁体\!newname!%%~xf")
  7.      move /y "!name!%%~xf" "!newpath!" &endlocal
  8. )
  9. pause&exit/b
复制代码
其实在循环体内处理字符串 '怪异' 字符的要点,就是要在关闭变量延迟时先取值循环变量,如 set "name=%%~nF", 其后再开启变量延迟即可正确处理 !name! 变量中的'怪异'字符了。如果这类'怪异'字符可被系统默认的936码页覆盖,则不必切换当前系统默认码页,否则须切换当前码页,例如可包含更多'怪异'字符的65001码页...

评分

参与人数 1技术 +1 收起 理由
1139054012 + 1 测试成功

查看全部评分

 楼主| 发表于 2025-6-5 16:08:27 | 显示全部楼层
本帖最后由 1139054012 于 2025-6-5 16:14 编辑

回复 7# aloha20200628


太感谢,犯傻了…一直处理文件,被这种特殊路径和文件名导致各种失效闪退问题, 这下可以完美解决疑难杂症了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 05:59 , Processed in 0.031827 second(s), 14 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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