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

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

下面找的一段代码, 可以将当前文件夹下的文件名中的中文序号改为阿拉伯数字, 但是对于下面这个文件不行,会在&处截断,后面的名字没有了, 请高手指教, 提前感谢!

牧师《希伯来书》研读-------第十六讲 問題解答 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
复制代码

  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

评分人数

    • 5i365: 乐于助人, 技术牛X技术 + 1

TOP

  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

评分人数

    • 5i365: 乐于助人, 技术牛X技术 + 1

TOP

回复 2# idwma


    感谢帮忙, 这个不错很稳, 我可以定义 第XXX讲 中的前后两个字, 这样就不会把文件名中其它的字给替换掉

TOP

回复 2# idwma


    第一行这里必须得引上, 不然有 - 空格的时候就报错, 我被折腾过,   用 %~s0 难道不用引吗? 我还没试过
#@&cls&powershell "type '%~0'|out-string|iex"&pause&exit

TOP

回复 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

TOP

回复 6# 5i365
  1. 有简单的没搜到吗...
  2. Add-Type -AssemblyName Microsoft.VisualBasic
  3. [Microsoft.VisualBasic.strings]::StrConv('牧师《希伯来书》研读-------第十六讲 問題解答 Q&A - 1280x720 1384K.mp4',256)
复制代码
1

评分人数

TOP

回复 7# idwma


    多谢分享, 感觉PS太强大了, CMD能干的, PS都能干了, 反之好像不行

TOP

长江后浪推前浪。这很正常啊!!!
但有时又是各有千秋。

TOP

回复 3# for_flr


大侠好,请问加个约束 只替换 第XXX讲 中的中文序号, 应该加在哪里? 代码有点看不懂 , 例如, 下面的文件名
牧师《希伯来书》二十五研读-------第七十三讲 問題解答 Q&A - 1280x720 1384K.mp4

TOP

回复 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原创板块)

TOP

本帖最后由 5i365 于 2022-3-8 21:24 编辑

回复 11# for_flr


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

Pro '/My Proce/!/01' fail

TOP

  1. "Pro '/My Proce/!/01' fail" -match "'(.+)'"
  2. # $matches[1]为单引号内的内容。
  3. # $matches[0]为上面内容加单引号。
复制代码
*这个符号在正则表达式里面不是代表任意字符,.这个点号才是。

TOP

回复 13# for_flr


    多谢大侠指教!

TOP

返回列表