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

[文件操作] 请教批处理将文件名中的数字用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位)的文件名,不用处理
请高手帮忙!

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f %%i in ('dir /b/on *.jpg') do (
  3.    findstr /i "^( (" %%i&&echo %%i>>1.txt
  4.    findstr /i "-" %%i&&echo %%i>>2.txt
  5.    )
  6. for /f "tokens=1,2 delims=()()" %%i in ('type 1.txt') do (
  7.    set sz=0000%%j
  8.    set sz=!sz:~-4,4!
  9.    ren %%i(%%j).jpg %%i(!sz!).jpg
  10.    )
  11. for /f "tokens=1,2 delims=-" %%i in ('type 2.txt') do (
  12.    set sz=0000%%j
  13.    set sz=!sz:~-4,4!
  14.    ren %%i-%%j.jpg %%i-!sz!.jpg
  15.    )
  16. del /q 1.txt 2.txt
  17. exit
复制代码
我的思路是这样,没有测试。
目的,学习批处理

TOP

本帖最后由 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
)

TOP

回复 6# qixiaobin0715


    我试了下,是可以的,不过复杂,代码看不懂

TOP

本帖最后由 qixiaobin0715 于 2022-4-25 16:02 编辑

回复 5# autoav
只适合你提供的几种情况,括号和空格后面的编号属于特殊情况,需单独处理,所以代码有点长。未测试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     set filename=%%i
  5.     set "var=%%~ni"&set "var=!var:(= !"&set "var=!var:)= !"&set "var=!var:-= !"&set "var=!var:_= !"
  6.     for %%m in (!var!) do set str=%%m
  7.     set n=!str!&set /a n=n
  8.     if "!n!" equ "!str!" if "!n:~3!"=="" (
  9.         set /a m=n+1000&set m=!m:~-3!
  10.         for %%j in (!m!) do (
  11.             for %%n in (!n!) do (
  12.                 if not "!filename: %%n=!"=="!filename!" (
  13.                     ren "%%i" "!filename: %%n= %%j!"
  14.                 ) else if not "!filename:(%%n)=!"=="!filename!" (
  15.                     ren "%%i" "!filename:(%%n)=(%%j)!"
  16.                 ) else (
  17.                     for %%k in (- _) do (
  18.                         if not "!filename:%%k%%n=!"=="!filename!" ren "%%i" "!filename:%%k%%n=%%k%%j!"))))))
  19. pause&exit
复制代码
只要能解决问题就好,可以试试2楼代码。批处理代码太麻烦。

TOP

回复 3# qixiaobin0715


请大侠帮忙一下

TOP

回复 2# 5i365


    可以用传统bat批处理文件吗?

TOP

想了想,只用传统意义上的批处理也能实现,需要一点点技巧,代码较为繁琐。

TOP

本帖最后由 5i365 于 2022-4-24 19:47 编辑

回复 1# autoav

这个排序问题, 以前 idwma 大侠帮忙搞过, 试着改了一下, 感觉应该OK
  
  1. #@&cls&powershell "gc '%~f0'|out-string|iex"&pause&exit
  2. gci *.jpg -File |
  3. %{
  4.         #1.将()里面的数字用0补齐成3位数字,括号前面的数字不用处理
  5.         if ($_.BaseName -match "\((\d{1,2})\)$")
  6.         {
  7.                 $new = "{0}({1:d3})" -f $_.Name.split('(')[0], [int]$matches[1]
  8.                 ren $_ -NewName "$new$($_.Extension)"
  9.         }
  10.         
  11.         #2.将"-"后数字用0补齐成3位数字,"-"前面的数字不用处理
  12.         if ($_.BaseName -match "(.+[^\d])(\d{1,2})$")
  13.         {
  14.                 $new = "{0}{1:d3}" -f $matches[1], [int]$matches[2]
  15.                 ren $_ -NewName "$new$($_.Extension)"
  16.         }
  17. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

返回列表