如何让Bat脚本按数字顺序重命名文件夹内文件?
按数字顺序重命名文件夹内文件的Bat脚本修复方案
原脚本依赖dir /b /on *.jpg的排序逻辑,该参数采用字典序排序,会导致数字顺序混乱(如1,10,11,...,2,3...),无法实现预期的数字升序排列。以下是两种修复方案:
方案一:纯Bat命令实现数值排序
@echo off setlocal enabledelayedexpansion set "pasta=E:\Google Drive\_Projetos em andamento\Ano 2023\Album\Testando" set "contador=1" cd /d "%pasta%" :: 提取文件名数字并按数值排序后重命名 for /f "tokens=*" %%F in ('dir /b *.jpg ^| cmd /v:on /c "for /f %%N in (@^) do echo %%~nF" ^| sort /n') do ( :: 生成带补零的文件名,截取最后三位保证位数统一 set "novo_nome=00!contador!" ren "%%F.jpg" "!novo_nome:~-3!.jpg" set /a "contador+=1" ) endlocal
关键修改说明:
- 替换原
dir /on的字典序排序,改用sort /n执行数值排序,确保文件按数字大小升序排列。 - 通过
!novo_nome:~-3!截取补零后的最后三位,适配不同位数的计数器(如1→001、10→010、100→100)。
方案二:借助PowerShell实现更稳定的排序
如果文件名结构复杂,纯Bat逻辑可能存在局限性,可借助PowerShell的强类型排序:
@echo off setlocal enabledelayedexpansion set "pasta=E:\Google Drive\_Projetos em andamento\Ano 2023\Album\Testando" set "contador=1" cd /d "%pasta%" :: 调用PowerShell按文件名数字值排序 for /f "tokens=*" %%F in ('powershell -Command "Get-ChildItem *.jpg | Sort-Object {[int]$_.BaseName} | Select-Object -ExpandProperty Name"') do ( set "novo_nome=00!contador!" ren "%%F" "!novo_nome:~-3!.jpg" set /a "contador+=1" ) endlocal
优势:
Sort-Object {[int]$_.BaseName}将文件名(不含后缀)强制转换为整数后排序,彻底避免字典序的干扰,适配各种数字位数的文件名。
内容的提问来源于stack exchange,提问作者Angeni Fortal
相关产品推荐
相关产品推荐

