标题: [文件操作] 批处理如何将文件名中的百分数换成用中文表示 [打印本页]
作者: anyone4u 时间: 2020-8-14 16:54 标题: 批处理如何将文件名中的百分数换成用中文表示
将一个文件夹中带有百分数的文件名中的%换成百分之
例如:文件名为“我20日以50.2%的力量.doc”、“以20.3%的力量夺取11日的胜利.doc”
需要转换成“我20日以百分之50.2的力量.doc”、“以百分之20.3的力量夺取11日的胜利.doc”
以下自写代码初步实现上述功能,但也存在部分问题- SETLOCAL ENABLEDELAYEDEXPANSION
- FOR /F "DELIMS=" %%B IN ('DIR /B^|FINDSTR "%%"') DO (
- SET NAME0=%%B
- FOR /F "TOKENS=1,2 DELIMS=%%" %%E IN ("%%B") DO (
- SET NAME1=%%E
- SET NAME2=%%F
- CALL :NUM
- ))
-
- :NUM
- SET NUM0=
- FOR /L %%G IN (5,-1,1) DO (
- SET Z=!NAME1:~-%%G,1!
- IF !Z! GEQ 0 IF !Z! LEQ 9 SET NUM0=!NAME1:~-%%G! && SET NAME11=!NAME1:~0,-%%G! && GOTO END
- )
-
- :END
- SET NUM0=!NUM0: =!
- set NAME11=!NAME11: =!
- 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
- 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
- @if(0)==(0) echo off
- for /f "tokens=1* delims=/" %%i in ('dir /b *%%* ^| cscript //nologo //e:jscript "%~f0"') do (
- echo;"%%i" "%%j"
- )
- pause & exit
- @end
-
- while ( !WSH.StdIn.AtEndOfStream ) {
- var f = WSH.StdIn.ReadLine();
- WSH.Echo( f + '/' + f.replace(/(\d+(?:\.\d*)?)%/g, '百分之$1') );
- }
复制代码
作者: anyone4u 时间: 2020-8-15 22:28
回复 7# Gin_Q
如果百分数是整数,不存在小数点的话这个方法就不行了。
作者: yhcfsr 时间: 2020-8-16 10:09
- @echo off
-
- for /r %%a in (*.*) do (
- set "fullpath=%%~fa"
- for /f "tokens=1,* delims=%%" %%i in ("%%~nxa") do if "%%j" neq "" call :ren_file "%%~i" "%%~j"
- )
- )
- pause&exit /b
- :ren_file
- set "prefix=%~1"&&set "num="
- :loop
- set "ch=%prefix:~-1%"
- if "%ch%"=="." (set "prefix=%prefix:~,-1%"&&set "num=%ch%%num%"&&goto :loop)
- if "%ch%" leq "9" if "%ch%" geq "0" (set "prefix=%prefix:~,-1%"&&set "num=%ch%%num%"&&goto :loop)
- ren "%fullpath%" "%prefix%百分之%num%%~2"
- exit /b
复制代码
作者: Gin_Q 时间: 2020-8-17 09:18
本帖最后由 Gin_Q 于 2020-8-17 13:30 编辑
回复 8# yhcfsr
for /r 识别%号,赞一个!
我改了一下,50%以数字开头问题- @echo off
-
- for /r %%a in (*.*) do (
- for /f "tokens=1,* delims=%%" %%i in ("%%~nxa") do (
- if "%%j" neq "" call :check "%%i" "%%j"
- )
- )
-
- pause &exit
- :check
- set "str=%~1"
- set "digit="
- :loop
- set "ch=%str:~-1%"
- if "%ch%" == "" goto :re_name
- if "%ch%" == "." (
- set str=%str:~0,-1%
- set digit=%ch%%digit%
- goto :loop)
- if "%ch%" geq "0" if "%ch%" leq "9" (
- set str=%str:~0,-1%
- set digit=%ch%%digit%
- goto :loop)
- :re_name
- echo %str%百分之%digit%%~2%
- exit /b
复制代码
作者: WHY 时间: 2020-8-18 11:53
修改顶楼的脚本:- @echo off
- SETLOCAL ENABLEDELAYEDEXPANSION
- FOR /F "tokens=1* DELIMS=%%" %%B IN ('DIR /B /a-d *%%*') DO (
- SET "NAME0=%%B"
- CALL :NUM
- echo;"%%B%%%%C" "!NAME1!%%C"
- )
- pause & exit /b
-
- :NUM
- FOR /L %%G IN (1,1,5) DO (
- SET "Z=!NAME0:~-%%G!"
- for /f "delims=1234567890." %%i in ("#!Z!") do (
- if "%%i" == "#" (
- set "NAME1=!NAME0:~0,-%%G!百分之!Z!"
- ) else goto :EOF
- )
- )
复制代码
作者: 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行打开重命名- @echo off
- setlocal enabledelayedexpansion
- for /r %%i in ("*%%*.*") do (
- set "newName=%%~ni"
- set "newName=!newName:%%=%%%%!"
- call :getNewName "!newName!"
- echo %%i
- echo !newName!%%~xi
- REM rename "%%i" "!newName!%%~xi"
- echo ------------------------
- )
- pause&exit
-
- :getNewName
- set "str=%~1"
- set "numStr="
- set "newName="
- :loop
- set /a "1/%str:~0,1%" >nul 2>nul && set "numStr=%numStr%%str:~0,1%" || (
- if "%str:~0,1%"=="0" (
- set "numStr=%numStr%0"
- ) else (
- if "%str:~0,1%"=="." (
- set "numStr=%numStr%."
- ) else (
- if "%str:~0,1%"=="%%" (
- set "newName=%newName%百分之%numStr%"
- set "numStr="
- ) else (
- set "newName=%newName%%numStr%%str:~0,1%"
- set "numStr="
- )
- )
- )
- )
- set "str=%str:~1%"
- if not "%str%"=="" goto :loop
- goto :eof
复制代码
作者: yhcfsr 时间: 2020-8-18 20:53
回复 12# anyone4u - @echo off
- 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- @echo off
- 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 (
- echo;ren "%%j" "%%i"
- )
- pause
复制代码
作者: WHY 时间: 2020-8-19 15:31
本帖最后由 WHY 于 2020-8-27 13:06 编辑
再贴两个:
gawk- @echo off
- 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 (
- echo;ren "%%i" "%%j"
- )
- pause
复制代码
GREN- gren -s -g "(\d+(?:\.\d+)?)%%" "百分之$1"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |