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

[文件操作] 批处理如何将文件名中的百分数换成用中文表示

[复制链接]
发表于 2020-8-14 16:54:20 | 显示全部楼层 |阅读模式
将一个文件夹中带有百分数的文件名中的%换成百分之
例如:文件名为“我20日以50.2%的力量.doc”、“以20.3%的力量夺取11日的胜利.doc”
需要转换成“我20日以百分之50.2的力量.doc”、“以百分之20.3的力量夺取11日的胜利.doc”

以下自写代码初步实现上述功能,但也存在部分问题
  1. SETLOCAL ENABLEDELAYEDEXPANSION
  2. FOR /F "DELIMS=" %%B IN ('DIR /B^|FINDSTR "%%"') DO (
  3. SET NAME0=%%B
  4. FOR /F "TOKENS=1,2 DELIMS=%%" %%E IN ("%%B") DO (
  5. SET NAME1=%%E
  6. SET NAME2=%%F
  7. CALL :NUM
  8. ))

  9. :NUM
  10. SET NUM0=
  11. FOR /L %%G IN (5,-1,1) DO (
  12. SET Z=!NAME1:~-%%G,1!
  13. IF !Z! GEQ 0 IF !Z! LEQ 9 SET NUM0=!NAME1:~-%%G! && SET NAME11=!NAME1:~0,-%%G! && GOTO END
  14. )

  15. :END
  16. SET NUM0=!NUM0: =!
  17. set NAME11=!NAME11: =!
  18. echo "!NAME11!百分之!NUM0!!NAME2!"
复制代码
经过处理,解决部分问题。但仍存在以下问题:
1、NUM0总会把其中一个含%的文件名多取一次,例如上面的两个文件名,最后NUM0的数值是50.2 20.3 20.3,且在数值最后多一个空格
2、在文件名中百分数(含)5个字符内还有其他数字,结果将会出错。例:文件名为“1我15%.doc”,改名后结果为“百分之1我15.doc”。


望得到各位大大的帮助~不甚感谢~
发表于 2020-8-14 19:20:01 | 显示全部楼层
  1. powershell dir *.*^|foreach{ren $_ ($_ -replace '([\d.]+)%','百分之$1')}
复制代码
 楼主| 发表于 2020-8-14 19:35:29 | 显示全部楼层
回复 2# yhcfsr
powershell还未涉猎,请问如何单纯用批处理进行实现或我的代码如何修改能正确实现需要的功能。谢谢~
发表于 2020-8-14 20:00:57 | 显示全部楼层
回复 3# anyone4u


    赶紧涉猎一下吧,powershell是必然趋势
 楼主| 发表于 2020-8-14 20:14:23 | 显示全部楼层
回复 4# ivor
远水救不了近火啊,先解决这个问题再行学习
发表于 2020-8-15 18:55:43 | 显示全部楼层
  1. @if(0)==(0) echo off
  2. for /f "tokens=1* delims=/" %%i in ('dir /b *%%* ^| cscript //nologo //e:jscript "%~f0"') do (
  3.     echo;"%%i" "%%j"
  4. )
  5. pause & exit
  6. @end

  7. while ( !WSH.StdIn.AtEndOfStream ) {
  8.     var f = WSH.StdIn.ReadLine();
  9.     WSH.Echo( f + '/' + f.replace(/(\d+(?:\.\d*)?)%/g, '百分之$1') );
  10. }
复制代码
 楼主| 发表于 2020-8-15 22:28:42 | 显示全部楼层
回复 7# Gin_Q
如果百分数是整数,不存在小数点的话这个方法就不行了。
发表于 2020-8-16 10:09:12 | 显示全部楼层
  1. @echo off

  2. for /r %%a in (*.*) do (
  3.         set "fullpath=%%~fa"
  4.         for /f "tokens=1,* delims=%%" %%i in ("%%~nxa") do if "%%j" neq "" call :ren_file "%%~i" "%%~j"
  5.         )
  6. )
  7. pause&exit /b
  8. :ren_file
  9. set "prefix=%~1"&&set "num="
  10. :loop
  11. set "ch=%prefix:~-1%"
  12. if "%ch%"=="." (set "prefix=%prefix:~,-1%"&&set "num=%ch%%num%"&&goto :loop)
  13. if "%ch%" leq "9" if "%ch%" geq "0" (set "prefix=%prefix:~,-1%"&&set "num=%ch%%num%"&&goto :loop)
  14. ren "%fullpath%" "%prefix%百分之%num%%~2"
  15. exit /b
复制代码
发表于 2020-8-17 09:18:58 | 显示全部楼层
本帖最后由 Gin_Q 于 2020-8-17 13:30 编辑

回复 8# yhcfsr


    for /r 识别%号,赞一个!
    我改了一下,50%以数字开头问题
  1. @echo off

  2. for /r %%a in (*.*) do (
  3.     for /f "tokens=1,* delims=%%" %%i in ("%%~nxa") do (
  4.         if "%%j" neq "" call :check "%%i" "%%j"
  5.     )
  6. )

  7. pause &exit
  8. :check
  9.     set "str=%~1"
  10.     set "digit="
  11.     :loop
  12.         set "ch=%str:~-1%"
  13.         if "%ch%" == "" goto :re_name
  14.         if "%ch%" == "." (
  15.             set str=%str:~0,-1%
  16.             set digit=%ch%%digit%
  17.             goto :loop)
  18.         if "%ch%" geq "0" if "%ch%" leq "9" (
  19.             set str=%str:~0,-1%
  20.             set digit=%ch%%digit%
  21.             goto :loop)
  22.     :re_name
  23.         echo %str%百分之%digit%%~2%
  24.     exit /b
复制代码
发表于 2020-8-18 11:53:58 | 显示全部楼层
修改顶楼的脚本:
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. FOR /F "tokens=1* DELIMS=%%" %%B IN ('DIR /B /a-d *%%*') DO (
  4.     SET "NAME0=%%B"
  5.     CALL :NUM
  6.     echo;"%%B%%%%C" "!NAME1!%%C"
  7. )
  8. pause & exit /b

  9. :NUM
  10. FOR /L %%G IN (1,1,5) DO (
  11.     SET "Z=!NAME0:~-%%G!"
  12.     for /f "delims=1234567890." %%i in ("#!Z!") do (
  13.         if "%%i" == "#" (
  14.             set "NAME1=!NAME0:~0,-%%G!百分之!Z!"
  15.         ) else goto :EOF
  16.     )
  17. )
复制代码
发表于 2020-8-18 16:30:37 | 显示全部楼层
回复 10# WHY


    不错,echo %%还可以这样!5次循环感觉不怎么好,写死了!2位数也会执行5次,超过5次又会bug。
 楼主| 发表于 2020-8-18 16:54:04 | 显示全部楼层
回复 8# yhcfsr
你的脚本比较完美的解决我的问题,但仍存在文件名中若存在多个百分数无法正确改名的小问题。
 楼主| 发表于 2020-8-18 16:55:59 | 显示全部楼层
回复 11# Gin_Q
我这里的文件基本不会出现超过100%的百分数,所以一开始就弄了个比较笨的方法来处理。
发表于 2020-8-18 19:02:04 | 显示全部楼层
本帖最后由 went 于 2020-8-18 19:04 编辑

第9行打开重命名
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r %%i in ("*%%*.*") do (
  4.         set "newName=%%~ni"
  5.         set "newName=!newName:%%=%%%%!"
  6.         call :getNewName "!newName!"
  7.         echo %%i
  8.         echo !newName!%%~xi
  9.         REM rename "%%i" "!newName!%%~xi"
  10.         echo ------------------------
  11. )
  12. pause&exit

  13. :getNewName
  14. set "str=%~1"
  15. set "numStr="
  16. set "newName="
  17.         :loop
  18.         set /a "1/%str:~0,1%" >nul 2>nul && set "numStr=%numStr%%str:~0,1%" || (
  19.                 if "%str:~0,1%"=="0" (
  20.                         set "numStr=%numStr%0"
  21.                 ) else (
  22.                         if "%str:~0,1%"=="." (
  23.                                 set "numStr=%numStr%."
  24.                         ) else (
  25.                                 if "%str:~0,1%"=="%%" (
  26.                                                 set "newName=%newName%百分之%numStr%"
  27.                                                 set "numStr="
  28.                                 ) else (
  29.                                         set "newName=%newName%%numStr%%str:~0,1%"
  30.                                         set "numStr="
  31.                                 )
  32.                         )
  33.                 )
  34.         )
  35.         set "str=%str:~1%"
  36.         if not "%str%"=="" goto :loop
  37. goto :eof
复制代码
发表于 2020-8-18 20:53:21 | 显示全部楼层
回复 12# anyone4u
  1. @echo off
  2. Powershell -Command "& {Get-ChildItem *.* -r |foreach-object{ren $_ ($_.Name -replace '([\d.]+)%%','百分之$1')}}"&pause
复制代码
这段BAT代码可以满足你, 前提必须是WIN7及以上系统
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 04:34 , Processed in 0.022151 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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