Board logo

标题: [文件操作] 批处理如何将文件名中的百分数换成用中文表示 [打印本页]

作者: anyone4u    时间: 2020-8-14 16:54     标题: 批处理如何将文件名中的百分数换成用中文表示

将一个文件夹中带有百分数的文件名中的%换成百分之
例如:文件名为“我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”。


望得到各位大大的帮助~不甚感谢~
作者: yhcfsr    时间: 2020-8-14 19:20

  1. powershell dir *.*^|foreach{ren $_ ($_ -replace '([\d.]+)%','百分之$1')}
复制代码

作者: anyone4u    时间: 2020-8-14 19:35

回复 2# yhcfsr
powershell还未涉猎,请问如何单纯用批处理进行实现或我的代码如何修改能正确实现需要的功能。谢谢~
作者: ivor    时间: 2020-8-14 20:00

回复 3# anyone4u


    赶紧涉猎一下吧,powershell是必然趋势
作者: anyone4u    时间: 2020-8-14 20:14

回复 4# ivor
远水救不了近火啊,先解决这个问题再行学习
作者: WHY    时间: 2020-8-15 18:55

  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. }
复制代码

作者: anyone4u    时间: 2020-8-15 22:28

回复 7# Gin_Q
如果百分数是整数,不存在小数点的话这个方法就不行了。
作者: yhcfsr    时间: 2020-8-16 10:09

  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
复制代码

作者: Gin_Q    时间: 2020-8-17 09:18

本帖最后由 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
复制代码

作者: WHY    时间: 2020-8-18 11:53

修改顶楼的脚本:
  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. )
复制代码

作者: Gin_Q    时间: 2020-8-18 16:30

回复 10# WHY


    不错,echo %%还可以这样!5次循环感觉不怎么好,写死了!2位数也会执行5次,超过5次又会bug。
作者: anyone4u    时间: 2020-8-18 16:54

回复 8# yhcfsr
你的脚本比较完美的解决我的问题,但仍存在文件名中若存在多个百分数无法正确改名的小问题。
作者: anyone4u    时间: 2020-8-18 16:55

回复 11# Gin_Q
我这里的文件基本不会出现超过100%的百分数,所以一开始就弄了个比较笨的方法来处理。
作者: went    时间: 2020-8-18 19:02

本帖最后由 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
复制代码

作者: yhcfsr    时间: 2020-8-18 20:53

回复 12# anyone4u
  1. @echo off
  2. Powershell -Command "& {Get-ChildItem *.* -r |foreach-object{ren $_ ($_.Name -replace '([\d.]+)%%','百分之$1')}}"&pause
复制代码
这段BAT代码可以满足你, 前提必须是WIN7及以上系统
作者: WHY    时间: 2020-8-18 21:53

本帖最后由 WHY 于 2020-8-27 13:11 编辑

回复 11# Gin_Q


    嗯,我认为这个问题用纯批来解本身就不合适,除非完全不考虑通用性和效率。
for /L 方式比 call + goto oop 效率要高,顶楼的思路(5个字符)既然已经能够匹配到数字和%,为啥一定要 goto :Loop 逐字判断呢?
脚本并非总是循环 5 次,goto :EOF 可以提前退出循环。

贴一个第三方 方案:
  sed
  1. @echo off
  2. for /f "tokens=1* delims=/" %%i in ('dir /b /a-d /s *%%* ^| sed -r "h; s/.*\\//; s/([0-9]+\.?[0-9]+)%%/百分之\1/g; G; s/\n/\//"') do (
  3.     echo;ren "%%j" "%%i"
  4. )
  5. pause
复制代码

作者: WHY    时间: 2020-8-19 15:31

本帖最后由 WHY 于 2020-8-27 13:06 编辑

再贴两个:
gawk
  1. @echo off
  2. for /f "tokens=1* delims=/" %%i in ('dir /b /a-d /s *%%* ^| gawk -F"\\" "{print $0\"/\"gensub(/([0-9]+(\.[0-9]+)?)%%/, \"百分之\\1\", \"g\", $NF)}"') do (
  3.     echo;ren "%%i" "%%j"
  4. )
  5. pause
复制代码
GREN
  1. gren -s -g "(\d+(?:\.\d+)?)%%" "百分之$1"
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2