标题: [文本处理] 批处理如何将文件名中的中文序号改为阿拉伯数字? [打印本页]
作者: 5i365 时间: 2022-3-7 18:29 标题: 批处理如何将文件名中的中文序号改为阿拉伯数字?
下面找的一段代码, 可以将当前文件夹下的文件名中的中文序号改为阿拉伯数字, 但是对于下面这个文件不行,会在&处截断,后面的名字没有了, 请高手指教, 提前感谢!
牧师《希伯来书》研读-------第十六讲 問題解答 Q&A - 1280x720 1384K.mp4
期待精通PS的高手, 能用PS代码实现一下就好了, 相对好理解一些! 另外, 如果我想将文件名中的繁体改为简体, 能有什么好的PS或CMD方法实现吗?- @echo off
-
- for /f "delims=" %%i in ('dir /b') do call :Replacement "%%i"
-
- exit
-
- :Replacement
-
- set t1=%~1
-
- set t1=%t1:九十=90%
-
- set t1=%t1:八十=80%
-
- set t1=%t1:七十=70%
-
- set t1=%t1:六十=60%
-
- set t1=%t1:五十=50%
-
- set t1=%t1:四十=40%
-
- set t1=%t1:三十=30%
-
- set t1=%t1:二十=20%
-
- set t1=%t1:十一=11%
-
- set t1=%t1:十二=12%
-
- set t1=%t1:十三=13%
-
- set t1=%t1:十四=14%
-
- set t1=%t1:十五=15%
-
- set t1=%t1:十六=16%
-
- set t1=%t1:十七=17%
-
- set t1=%t1:十八=18%
-
- set t1=%t1:十九=19%
-
- set t1=%t1:十=10%
-
- set t1=%t1:九=9%
-
- set t1=%t1:八=8%
-
- set t1=%t1:七=7%
-
- set t1=%t1:六=6%
-
- set t1=%t1:五=5%
-
- set t1=%t1:四=4%
-
- set t1=%t1:三=3%
-
- set t1=%t1:二=2%
-
- set t1=%t1:一=1%
-
- set t1=%t1:零=0%
-
- set t1=%t1:09=9%
-
- set t1=%t1:08=8%
-
- set t1=%t1:07=7%
-
- set t1=%t1:06=6%
-
- set t1=%t1:05=5%
-
- set t1=%t1:04=4%
-
- set t1=%t1:03=3%
-
- set t1=%t1:02=2%
-
- set t1=%t1:01=1%
-
- echo %t1%
-
- ren %1 "%t1%"
-
- goto :eof
复制代码
作者: idwma 时间: 2022-3-7 20:00
- #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
- $a=@{
- '一'='1'
- '二'='2'
- '三'='3'
- '四'='4'
- '五'='5'
- '六'='6'
- '七'='7'
- '八'='8'
- '九'='9'
- '十'='10'
- }
-
- dir -name|%{
- $_ -match "第(($($a.keys -join '|'))+)讲"
- if($matches[1].length -gt 1){$c=$a["$($matches[1][0])"][0]+$a["$($matches[1][-1])"][-1]}else{$c=$a[$matches[1]]}
- $_
- $_ -replace "$($matches[1])","$c"
- }
复制代码
作者: for_flr 时间: 2022-3-7 20:30
- function zhongwen ()
- {
- $a = [ordered] @{"零"=0; "一"=1; "二"=2; "三"=3; "四"=4; "五"=5; "六"=6; "七"=7; "八"=8; "九"=9}
- $b = [ordered] @{"十"=10; "百"=100; "千"=1000}
- $c = [ordered] @{"万"=10000}
- $d = [ordered] @{"亿"=100000000}
-
- $str = $args[0] -replace "(?<=^|[^一二三四五六七八九])十","一十"
- $x = $str -split ""
-
- [long[]] $ss = @(0) * 3
- $i = 0
- while ($i -le $x.count)
- {
- $i++
- $s = $x[$i]
- if ($a.keys -contains $s)
- {
- $ss[0] = $ss[0] * 10 + $a[$s]
- } elseif ($b.keys -contains $s)
- {
- $ss[1] += $ss[0] * $b[$s]
- $ss[0] = 0
- } elseif ($c.keys -contains $s)
- {
- $ss[1] = ($ss[1] + $ss[0]) * $c[$s]
- $ss[0] = 0
- } elseif ($d.keys -contains $s)
- {
- $ss[2] = ($ss[2] + $ss[1] + $ss[0]) * $d[$s]
- $ss[1] = 0
- $ss[0] = 0
- } elseif ($s -eq "")
- {
- $ss[2] = $ss[2] + $ss[1] + $ss[0]
- $ss[1] = 0
- $ss[0] = 0
- }
- }
-
- return $ss[2]
- }
-
- dir |?{$_ -match "一|二|三|四|五|六|七|八|九|十|百|千|零"}|ren -newname{
- $oldnumber=[regex]::matches($_.name,'一|二|三|四|五|六|七|八|九|十|百|千|零').value -join ""
- $newnumber=zhongwen $oldnumber
- $_.name.replace($oldnumber,$newnumber)
- }
复制代码
作者: 5i365 时间: 2022-3-7 20:52
回复 2# idwma
感谢帮忙, 这个不错很稳, 我可以定义 第XXX讲 中的前后两个字, 这样就不会把文件名中其它的字给替换掉
作者: 5i365 时间: 2022-3-7 20:57
回复 2# idwma
第一行这里必须得引上, 不然有 - 空格的时候就报错, 我被折腾过, 用 %~s0 难道不用引吗? 我还没试过
#@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
作者: 5i365 时间: 2022-3-7 22:05
回复 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
作者: idwma 时间: 2022-3-7 22:28
回复 6# 5i365 - 有简单的没搜到吗...
- Add-Type -AssemblyName Microsoft.VisualBasic
- [Microsoft.VisualBasic.strings]::StrConv('牧师《希伯来书》研读-------第十六讲 問題解答 Q&A - 1280x720 1384K.mp4',256)
复制代码
作者: 5i365 时间: 2022-3-7 22:32
回复 7# idwma
多谢分享, 感觉PS太强大了, CMD能干的, PS都能干了, 反之好像不行
作者: qixiaobin0715 时间: 2022-3-8 09:30
长江后浪推前浪。这很正常啊!!!
但有时又是各有千秋。
作者: 5i365 时间: 2022-3-8 12:15
回复 3# for_flr
大侠好,请问加个约束 只替换 第XXX讲 中的中文序号, 应该加在哪里? 代码有点看不懂 , 例如, 下面的文件名
牧师《希伯来书》二十五研读-------第七十三讲 問題解答 Q&A - 1280x720 1384K.mp4
作者: for_flr 时间: 2022-3-8 21:09
回复 10# 5i365 -
- function zhongwen (){
- $a = [ordered] @{"零"=0; "一"=1; "二"=2; "三"=3; "四"=4; "五"=5; "六"=6; "七"=7; "八"=8; "九"=9}
- $b = [ordered] @{"十"=10; "百"=100; "千"=1000}
- $c = [ordered] @{"万"=10000}
- $d = [ordered] @{"亿"=100000000}
-
- $str = $args[0] -replace "(?<=^|[^一二三四五六七八九])十","一十"
- $x = $str -split ""
-
- [long[]] $ss = @(0) * 3
- $i = 0
- while ($i -le $x.count)
- {
- $i++
- $s = $x[$i]
- if ($a.keys -contains $s)
- {
- $ss[0] = $ss[0] * 10 + $a[$s]
- } elseif ($b.keys -contains $s)
- {
- $ss[1] += $ss[0] * $b[$s]
- $ss[0] = 0
- } elseif ($c.keys -contains $s)
- {
- $ss[1] = ($ss[1] + $ss[0]) * $c[$s]
- $ss[0] = 0
- } elseif ($d.keys -contains $s)
- {
- $ss[2] = ($ss[2] + $ss[1] + $ss[0]) * $d[$s]
- $ss[1] = 0
- $ss[0] = 0
- } elseif ($s -eq "")
- {
- $ss[2] = $ss[2] + $ss[1] + $ss[0]
- $ss[1] = 0
- $ss[0] = 0
- }
- }
- return $ss[2]
- }
-
- dir |%{
- if ($_ -match '第(.+)讲'){
- $_|ren -newname{
- $newnumber=zhongwen $matches[1]
- $_.name.replace($matches[1],$newnumber)
- }
- }
- }
复制代码
前面大括号是个转小写函数,只需要在后面dir里面提取“第...讲”之间的数字传给函数。(该函数来copy自论坛powershell原创板块)
作者: 5i365 时间: 2022-3-8 21:22
本帖最后由 5i365 于 2022-3-8 21:24 编辑
回复 11# for_flr
多谢, 能顺便请教个相关的问题吗? 怎样用-match 取下面这行文字中的两个单引号间的内容, 即 /My Proce/!/01 我用 -match "'*'" 不灵
Pro '/My Proce/!/01' fail
作者: for_flr 时间: 2022-3-8 21:54
- "Pro '/My Proce/!/01' fail" -match "'(.+)'"
- # $matches[1]为单引号内的内容。
- # $matches[0]为上面内容加单引号。
复制代码
*这个符号在正则表达式里面不是代表任意字符,.这个点号才是。
作者: 5i365 时间: 2022-3-8 23:06
回复 13# for_flr
多谢大侠指教!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |