标题: [文件操作] 请教批处理将文件名中的数字用0补齐的问题? [打印本页]
作者: autoav 时间: 2022-4-24 15:32 标题: 请教批处理将文件名中的数字用0补齐的问题?
我需要将jpg文件排序,发现有些数字命名排序时,10可能会插到1和2中间,导致错误,就需要将1和2补齐成001,002,10补齐成010,这样排序就正常了。
我要求的规则如下:
1、照片1(1),照片1(2)。。。照片1(10)。。照片1(102)。这种情况,需要将()里面的数字用0补齐成3位数字,括号前面的数字不用处理。
2、外景2001-1,外景2001-2,外景2001-10,外景2001-122等等,这种情况,需要将“-”后数字用0补齐成3位数字,“-”前面的数字不用处理。“-”是举例,也有可能是"_"、空格等
3、外景20220303001,这种长数字(大于4位)的文件名,不用处理
请高手帮忙!
作者: 5i365 时间: 2022-4-24 19:41
本帖最后由 5i365 于 2022-4-24 19:47 编辑
回复 1# autoav
这个排序问题, 以前 idwma 大侠帮忙搞过, 试着改了一下, 感觉应该OK
- #@&cls&powershell "gc '%~f0'|out-string|iex"&pause&exit
- gci *.jpg -File |
- %{
- #1.将()里面的数字用0补齐成3位数字,括号前面的数字不用处理
- if ($_.BaseName -match "\((\d{1,2})\)$")
- {
- $new = "{0}({1:d3})" -f $_.Name.split('(')[0], [int]$matches[1]
- ren $_ -NewName "$new$($_.Extension)"
- }
-
- #2.将"-"后数字用0补齐成3位数字,"-"前面的数字不用处理
- if ($_.BaseName -match "(.+[^\d])(\d{1,2})$")
- {
- $new = "{0}{1:d3}" -f $matches[1], [int]$matches[2]
- ren $_ -NewName "$new$($_.Extension)"
- }
- }
复制代码
作者: qixiaobin0715 时间: 2022-4-25 13:37
想了想,只用传统意义上的批处理也能实现,需要一点点技巧,代码较为繁琐。
作者: autoav 时间: 2022-4-25 15:43
回复 2# 5i365
可以用传统bat批处理文件吗?
作者: autoav 时间: 2022-4-25 15:44
回复 3# qixiaobin0715
请大侠帮忙一下
作者: qixiaobin0715 时间: 2022-4-25 16:01
本帖最后由 qixiaobin0715 于 2022-4-25 16:02 编辑
回复 5# autoav
只适合你提供的几种情况,括号和空格后面的编号属于特殊情况,需单独处理,所以代码有点长。未测试:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- set filename=%%i
- set "var=%%~ni"&set "var=!var:(= !"&set "var=!var:)= !"&set "var=!var:-= !"&set "var=!var:_= !"
- for %%m in (!var!) do set str=%%m
- set n=!str!&set /a n=n
- if "!n!" equ "!str!" if "!n:~3!"=="" (
- set /a m=n+1000&set m=!m:~-3!
- for %%j in (!m!) do (
- for %%n in (!n!) do (
- if not "!filename: %%n=!"=="!filename!" (
- ren "%%i" "!filename: %%n= %%j!"
- ) else if not "!filename:(%%n)=!"=="!filename!" (
- ren "%%i" "!filename:(%%n)=(%%j)!"
- ) else (
- for %%k in (- _) do (
- if not "!filename:%%k%%n=!"=="!filename!" ren "%%i" "!filename:%%k%%n=%%k%%j!"))))))
- pause&exit
复制代码
只要能解决问题就好,可以试试2楼代码。批处理代码太麻烦。
作者: autoav 时间: 2022-4-25 17:48
回复 6# qixiaobin0715
我试了下,是可以的,不过复杂,代码看不懂
作者: autoav 时间: 2022-4-25 17:52
本帖最后由 autoav 于 2022-4-25 17:53 编辑
我自己整了一个,逻辑比较简单,当然功能也比较简单,只判断了是不是()结尾,以及最后几位是不是“-”、“_”/" ",基本可以满足我的要求
@echo off & setlocal enabledelayedexpansion
for /d %%i in (*) do (
pushd "%%i"
for %%a in (*.txt *.png *.jpg) do (
set "f=%%a"
set "k=!f:~-7,1!"
if "!k!" equ "(" set "k=!f:~0,-7!(0!f:~-6!" & ren "!f!" "!k!" & set "f=!k!"
set "k=!f:~-8,1!"
if "!k!" equ "(" set "k=!f:~0,-8!(0!f:~-7!" & ren "!f!" "!k!" & set "f=!k!"
set "k=!f:~-9,1!"
if "!k!" equ "(" set "k=!f:~0,-9!(0!f:~-8!" & ren "!f!" "!k!" & set "f=!k!"
set "k=!f:~-6,1!"
if "!k!" equ "-" set "k=!f:~0,-5!0!f:~-5!" & ren "!f!" "!k!" & set "f=!k!"
if "!k!" equ "_" set "k=!f:~0,-5!0!f:~-5!" & ren "!f!" "!k!" & set "f=!k!"
if "!k!" equ " " set "k=!f:~0,-5!0!f:~-5!" & ren "!f!" "!k!" & set "f=!k!"
set "k=!f:~-7,1!"
if "!k!" equ "-" set "k=!f:~0,-6!0!f:~-6!" & ren "!f!" "!k!" & set "f=!k!"
if "!k!" equ "_" set "k=!f:~0,-6!0!f:~-6!" & ren "!f!" "!k!" & set "f=!k!"
if "!k!" equ " " set "k=!f:~0,-6!0!f:~-6!" & ren "!f!" "!k!" & set "f=!k!"
set "k=!f:~-8,1!"
if "!k!" equ "-" set "k=!f:~0,-7!0!f:~-7!" & ren "!f!" "!k!"
if "!k!" equ "_" set "k=!f:~0,-7!0!f:~-7!" & ren "!f!" "!k!"
if "!k!" equ " " set "k=!f:~0,-7!0!f:~-7!" & ren "!f!" "!k!"
)
popd
)
作者: hlzj88 时间: 2022-4-25 19:55
- @echo off & setlocal enabledelayedexpansion
-
- for /f %%i in ('dir /b/on *.jpg') do (
- findstr /i "^( (" %%i&&echo %%i>>1.txt
- findstr /i "-" %%i&&echo %%i>>2.txt
- )
-
- for /f "tokens=1,2 delims=()()" %%i in ('type 1.txt') do (
- set sz=0000%%j
- set sz=!sz:~-4,4!
- ren %%i(%%j).jpg %%i(!sz!).jpg
- )
-
- for /f "tokens=1,2 delims=-" %%i in ('type 2.txt') do (
- set sz=0000%%j
- set sz=!sz:~-4,4!
- ren %%i-%%j.jpg %%i-!sz!.jpg
- )
-
- del /q 1.txt 2.txt
- exit
复制代码
我的思路是这样,没有测试。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |