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

[文本处理] 批处理如何将文件名中的中文序号改为阿拉伯数字?

[复制链接]
发表于 2022-3-7 18:29:27 | 显示全部楼层 |阅读模式
下面找的一段代码, 可以将当前文件夹下的文件名中的中文序号改为阿拉伯数字, 但是对于下面这个文件不行,会在&处截断,后面的名字没有了, 请高手指教, 提前感谢!

牧师《希伯来书》研读-------第十六讲 問題解答 Q&A - 1280x720 1384K.mp4

期待精通PS的高手, 能用PS代码实现一下就好了, 相对好理解一些! 另外, 如果我想将文件名中的繁体改为简体, 能有什么好的PS或CMD方法实现吗?
  1. @echo off

  2. for /f  "delims=" %%i in ('dir /b') do call :Replacement "%%i"

  3. exit

  4. :Replacement

  5. set t1=%~1

  6. set t1=%t1:九十=90%

  7. set t1=%t1:八十=80%

  8. set t1=%t1:七十=70%

  9. set t1=%t1:六十=60%

  10. set t1=%t1:五十=50%

  11. set t1=%t1:四十=40%

  12. set t1=%t1:三十=30%

  13. set t1=%t1:二十=20%

  14. set t1=%t1:十一=11%

  15. set t1=%t1:十二=12%

  16. set t1=%t1:十三=13%

  17. set t1=%t1:十四=14%

  18. set t1=%t1:十五=15%

  19. set t1=%t1:十六=16%

  20. set t1=%t1:十七=17%

  21. set t1=%t1:十八=18%

  22. set t1=%t1:十九=19%

  23. set t1=%t1:十=10%

  24. set t1=%t1:九=9%

  25. set t1=%t1:八=8%

  26. set t1=%t1:七=7%

  27. set t1=%t1:六=6%

  28. set t1=%t1:五=5%

  29. set t1=%t1:四=4%

  30. set t1=%t1:三=3%

  31. set t1=%t1:二=2%

  32. set t1=%t1:一=1%

  33. set t1=%t1:零=0%

  34. set t1=%t1:09=9%

  35. set t1=%t1:08=8%

  36. set t1=%t1:07=7%

  37. set t1=%t1:06=6%

  38. set t1=%t1:05=5%

  39. set t1=%t1:04=4%

  40. set t1=%t1:03=3%

  41. set t1=%t1:02=2%

  42. set t1=%t1:01=1%

  43. echo %t1%

  44. ren %1 "%t1%"

  45. goto :eof
复制代码
发表于 2022-3-7 20:00:19 | 显示全部楼层
  1. #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
  2. $a=@{
  3. '一'='1'
  4. '二'='2'
  5. '三'='3'
  6. '四'='4'
  7. '五'='5'
  8. '六'='6'
  9. '七'='7'
  10. '八'='8'
  11. '九'='9'
  12. '十'='10'
  13. }

  14. dir -name|%{
  15. $_ -match "第(($($a.keys -join '|'))+)讲"
  16. if($matches[1].length -gt 1){$c=$a["$($matches[1][0])"][0]+$a["$($matches[1][-1])"][-1]}else{$c=$a[$matches[1]]}
  17. $_
  18. $_ -replace "$($matches[1])","$c"
  19. }
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 乐于助人, 技术牛X

查看全部评分

发表于 2022-3-7 20:30:18 | 显示全部楼层
  1. function zhongwen ()
  2. {
  3. $a = [ordered] @{"零"=0; "一"=1; "二"=2; "三"=3; "四"=4; "五"=5; "六"=6; "七"=7; "八"=8; "九"=9}
  4. $b = [ordered] @{"十"=10; "百"=100; "千"=1000}
  5. $c = [ordered] @{"万"=10000}
  6. $d = [ordered] @{"亿"=100000000}

  7. $str = $args[0] -replace "(?<=^|[^一二三四五六七八九])十","一十"
  8. $x = $str -split ""

  9. [long[]] $ss = @(0) * 3
  10. $i = 0
  11. while ($i -le $x.count)
  12. {
  13.     $i++
  14.     $s = $x[$i]
  15.     if ($a.keys -contains $s)
  16.     {
  17.         $ss[0] = $ss[0] * 10 + $a[$s]
  18.     } elseif ($b.keys -contains $s)
  19.     {
  20.         $ss[1] += $ss[0] * $b[$s]
  21.         $ss[0] = 0
  22.     } elseif ($c.keys -contains $s)
  23.     {
  24.         $ss[1] = ($ss[1] + $ss[0]) * $c[$s]
  25.         $ss[0] = 0
  26.     } elseif ($d.keys -contains $s)
  27.     {
  28.         $ss[2] = ($ss[2] + $ss[1] + $ss[0]) * $d[$s]
  29.         $ss[1] = 0
  30.         $ss[0] = 0
  31.     } elseif ($s -eq "")
  32.     {
  33.         $ss[2] = $ss[2] + $ss[1] + $ss[0]
  34.         $ss[1] = 0
  35.         $ss[0] = 0
  36.     }
  37. }

  38. return $ss[2]
  39. }

  40. dir |?{$_ -match "一|二|三|四|五|六|七|八|九|十|百|千|零"}|ren -newname{
  41. $oldnumber=[regex]::matches($_.name,'一|二|三|四|五|六|七|八|九|十|百|千|零').value -join ""
  42. $newnumber=zhongwen $oldnumber
  43. $_.name.replace($oldnumber,$newnumber)
  44. }
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 乐于助人, 技术牛X

查看全部评分

 楼主| 发表于 2022-3-7 20:52:57 | 显示全部楼层
回复 2# idwma


    感谢帮忙, 这个不错很稳, 我可以定义 第XXX讲 中的前后两个字, 这样就不会把文件名中其它的字给替换掉
 楼主| 发表于 2022-3-7 20:57:08 | 显示全部楼层
回复 2# idwma


    第一行这里必须得引上, 不然有 - 空格的时候就报错, 我被折腾过,   用 %~s0 难道不用引吗? 我还没试过
#@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
 楼主| 发表于 2022-3-7 22:05:47 | 显示全部楼层
回复 2# idwma


    刚刚终于找到繁简转换的PS代码了, 但是不知道怎用在上面的改文件名上面.
PS繁简转换函数下载 http://files.cnblogs.com/Icebird/CHS2CHT.rar
作者的使用方法说明:
如果你希望转换一个文本文件,则可以这样输入:
type 简体.txt | % { chs2cht($_) } > 繁体.txt
type 繁体.txt | % { cht2chs($_) } > 简体.txt
转载于:https://www.cnblogs.com/Icebird/archive/2008/02/13/CHS2CHT.html
发表于 2022-3-7 22:28:19 | 显示全部楼层
回复 6# 5i365
  1. 有简单的没搜到吗...
  2. Add-Type -AssemblyName Microsoft.VisualBasic
  3. [Microsoft.VisualBasic.strings]::StrConv('牧师《希伯来书》研读-------第十六讲 問題解答 Q&A - 1280x720 1384K.mp4',256)
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 太牛了

查看全部评分

 楼主| 发表于 2022-3-7 22:32:22 | 显示全部楼层
回复 7# idwma


    多谢分享, 感觉PS太强大了, CMD能干的, PS都能干了, 反之好像不行
发表于 2022-3-8 09:30:09 | 显示全部楼层
长江后浪推前浪。这很正常啊!!!
但有时又是各有千秋。
 楼主| 发表于 2022-3-8 12:15:56 | 显示全部楼层
回复 3# for_flr


大侠好,请问加个约束 只替换 第XXX讲 中的中文序号, 应该加在哪里? 代码有点看不懂 , 例如, 下面的文件名
牧师《希伯来书》二十五研读-------第七十三讲 問題解答 Q&A - 1280x720 1384K.mp4
发表于 2022-3-8 21:09:35 | 显示全部楼层
回复 10# 5i365
  1.    
  2. function zhongwen (){
  3. $a = [ordered] @{"零"=0; "一"=1; "二"=2; "三"=3; "四"=4; "五"=5; "六"=6; "七"=7; "八"=8; "九"=9}
  4. $b = [ordered] @{"十"=10; "百"=100; "千"=1000}
  5. $c = [ordered] @{"万"=10000}
  6. $d = [ordered] @{"亿"=100000000}

  7. $str = $args[0] -replace "(?<=^|[^一二三四五六七八九])十","一十"
  8. $x = $str -split ""

  9. [long[]] $ss = @(0) * 3
  10. $i = 0
  11. while ($i -le $x.count)
  12. {
  13.     $i++
  14.     $s = $x[$i]
  15.     if ($a.keys -contains $s)
  16.     {
  17.         $ss[0] = $ss[0] * 10 + $a[$s]
  18.     } elseif ($b.keys -contains $s)
  19.     {
  20.         $ss[1] += $ss[0] * $b[$s]
  21.         $ss[0] = 0
  22.     } elseif ($c.keys -contains $s)
  23.     {
  24.         $ss[1] = ($ss[1] + $ss[0]) * $c[$s]
  25.         $ss[0] = 0
  26.     } elseif ($d.keys -contains $s)
  27.     {
  28.         $ss[2] = ($ss[2] + $ss[1] + $ss[0]) * $d[$s]
  29.         $ss[1] = 0
  30.         $ss[0] = 0
  31.     } elseif ($s -eq "")
  32.     {
  33.         $ss[2] = $ss[2] + $ss[1] + $ss[0]
  34.         $ss[1] = 0
  35.         $ss[0] = 0
  36.     }
  37. }
  38. return $ss[2]
  39. }

  40. dir |%{
  41.     if ($_ -match '第(.+)讲'){
  42.         $_|ren -newname{
  43.             $newnumber=zhongwen $matches[1]
  44.             $_.name.replace($matches[1],$newnumber)
  45.         }
  46.     }
  47. }
复制代码
前面大括号是个转小写函数,只需要在后面dir里面提取“第...讲”之间的数字传给函数。(该函数来copy自论坛powershell原创板块)
 楼主| 发表于 2022-3-8 21:22:09 | 显示全部楼层
本帖最后由 5i365 于 2022-3-8 21:24 编辑

回复 11# for_flr


    多谢, 能顺便请教个相关的问题吗?  怎样用-match 取下面这行文字中的两个单引号间的内容, 即  /My Proce/!/01   我用 -match "'*'" 不灵

Pro '/My Proce/!/01' fail
发表于 2022-3-8 21:54:38 | 显示全部楼层
  1. "Pro '/My Proce/!/01' fail" -match "'(.+)'"
  2. # $matches[1]为单引号内的内容。
  3. # $matches[0]为上面内容加单引号。
复制代码
*这个符号在正则表达式里面不是代表任意字符,.这个点号才是。
 楼主| 发表于 2022-3-8 23:06:16 | 显示全部楼层
回复 13# for_flr


    多谢大侠指教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 07:19 , Processed in 0.025304 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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