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

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

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


望得到各位大大的帮助~不甚感谢~

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

TOP

回复 2# yhcfsr
powershell还未涉猎,请问如何单纯用批处理进行实现或我的代码如何修改能正确实现需要的功能。谢谢~

TOP

回复 3# anyone4u


    赶紧涉猎一下吧,powershell是必然趋势
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

回复 4# ivor
远水救不了近火啊,先解决这个问题再行学习

TOP

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

TOP

回复 7# Gin_Q
如果百分数是整数,不存在小数点的话这个方法就不行了。

TOP

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

TOP

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

TOP

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

TOP

回复 10# WHY


    不错,echo %%还可以这样!5次循环感觉不怎么好,写死了!2位数也会执行5次,超过5次又会bug。

TOP

回复 8# yhcfsr
你的脚本比较完美的解决我的问题,但仍存在文件名中若存在多个百分数无法正确改名的小问题。

TOP

回复 11# Gin_Q
我这里的文件基本不会出现超过100%的百分数,所以一开始就弄了个比较笨的方法来处理。

TOP

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

TOP

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

TOP

返回列表