标题: [文件操作] [已解决]批处理如何将文件夹内的文件按给定的重命名? [打印本页]
作者: czvde 时间: 2019-4-22 22:23 标题: [已解决]批处理如何将文件夹内的文件按给定的重命名?
本帖最后由 czvde 于 2019-4-23 12:14 编辑
求助各位大绅
我文件夹内有一批文件如下:
zzfabc-1.txt
zzfabc-2.txt
.......
zzfabc-67.txt
如何用批处理批量重命名成如下:
[67_01_A]zzfabc-1.txt
[67_02]zzfabc-2.txt
.......
[67_67_B]zzfabc-67.txt
作者: zaqmlp 时间: 2019-4-22 23:20
本帖最后由 zaqmlp 于 2019-4-23 02:45 编辑
- @echo off
- mode con lines=3000
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- powershell ^
- $list=dir *-*.txt^|?{$_ -is [System.IO.FileInfo]}^|group {$_.BaseName -replace '\d+$'};^
- foreach($item in $list){^
- $arr=@($item.group^|sort {[int]($_.BaseName -replace '^^.+-','')});^
- $max=$arr[$arr.length-1].BaseName -replace '^^.+-','';^
- for($i=0;$i -lt $arr.length;$i++){^
- $num=$arr[$i].BaseName -replace '^^.+-','';^
- $four=-join(($arr[$i].BaseName.split('-')[0])[-4..-1]);^
- $str='['+$max.PadLeft(2,'0')+'_'+$num.PadLeft(2,'0');^
- if($i -eq 0){^
- $str+='_A]';^
- }else{^
- if($i -eq ($arr.length-1)){^
- $str+='_B]';^
- }else{^
- $str+=']';^
- };^
- };^
- write-host ($arr[$i].Name+' --^> ['+$four.toUpper()+']'+$str+$arr[$i].Name);^
- mv -liter $arr[$i].Name ('['+$four.toUpper()+']'+$str+$arr[$i].Name);^
- };^
- }
- echo;%info%
- pause
复制代码
作者: czvde 时间: 2019-4-23 00:40
本帖最后由 czvde 于 2019-4-23 03:30 编辑
回复 2# zaqmlp
在你的批处理原基础如何再增加一个提取原文件名中“-”的前面4个字符的重命名,字母要求大写 效果如下:
[F1BC][04_01_A]edf1bc-1.txt
[F1BC][04_02]edf1bc-2.txt
[F1BC][04_03]edf1bc-3.txt
[F1BC][04_04_B]edf1bc-4.txt
[1D8U][74_01_A]zxy1d8u-1.txt
[1D8U][74_02]zxy1d8u-2.txt
[1D8U][74_03]zxy1d8u-3.txt
.......
[1D8U][74_74_B]zxy1d8u-74.txt
如何实现?
作者: yhcfsr 时间: 2019-4-23 01:51
回复 3# czvde
保存为bat与处理文件放一起
测试前请备份文件- @Powershell "& {[ScriptBlock]::Create("'#' + ([io.file]::ReadAllText('%~f0',[text.encoding]::Default))").Invoke()}" & pause & exit
- $files = Get-ChildItem -Path .\* -Include *.txt;
- $count = $files.Count;
- $lastFile='';
- $dic = New-Object -TypeName 'System.Collections.Generic.Dictionary[string,object]'
-
-
- #文件按基名前缀分组
- foreach($file in $files)
- {
- if($file.BaseName -match '^(.*?)-(\d+)$')
- {
- if(-not $dic.ContainsKey($Matches[1])){
- $dic.Add($Matches[1],[System.Collections.ArrayList] @([int] $Matches[2]));
- }
- else {
- [void] $dic[$Matches[1]].Add([int] $Matches[2]);
- }
- }
-
- }
- #组内文件按基名后缀排序
- foreach($key in $dic.Keys)
- {
- $count=$dic[$key].Count;
- $counter=0;
- foreach($index in ($dic[$key]|sort))
- {
-
- switch(++$counter)
- {
- 1 {$subfix = '_A';break;}
- $count {$subfix = '_B';break;}
- default {$subfix = '';break;}
- }
-
- [string] $num=$index;
- if($index -lt 10) {$num="{0:00}" -f $index}
- if($key -match '(\w{4})$'){
- ren "$key-$index.txt" "[$($Matches[1].ToUpper())][$count-$num$subfix]$key-$index.txt"
- }
-
- }
- }
复制代码
作者: zaqmlp 时间: 2019-4-23 02:37
回复 3# czvde
我测试时结果是这样,不知你贴出的结果哪里来的
已增加了4位大写字符
话说,要是超过100,数值怎么表示
作者: czvde 时间: 2019-4-23 03:12
本帖最后由 czvde 于 2019-4-23 12:16 编辑
回复 5# zaqmlp
你的批处理运行结果是:
[F1BC][4_1_A]edf1bc-1.txt
[F1BC][4_2]edf1bc-2.txt
[F1BC][4_3]edf1bc-3.txt
[F1BC][4_4_B]edf1bc-4.txt
我希望运行结果是:
[F1BC][04_01_A]edf1bc-1.txt
[F1BC][04_02]edf1bc-2.txt
[F1BC][04_03]edf1bc-3.txt
[F1BC][04_04_B]edf1bc-4.txt
需要如何修改?
作者: zaqmlp 时间: 2019-4-23 11:07
回复 6# czvde
大概我用到了假系统
作者: czvde 时间: 2019-4-23 12:14
本帖最后由 czvde 于 2019-4-23 12:16 编辑
回复 7# zaqmlp
谢谢
作者: zaqmlp 时间: 2019-4-23 12:26
回复 8# czvde
赞助实际点
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |