批处理脚本中的直观文件排序?

Intuitive file sorting in batch scripts?

所以在 Windows 资源管理器中,我将这些文件排序如下:

我有这个脚本来删除括号和一个零,如果尾随数字大于或等于 10,则删除两个零:

cd C:\folder
setlocal enabledelayedexpansion


SET /A COUNT=0

for %%a in (*.jpg) do (
    SET /A COUNT+=1
    ECHO !COUNT!
    set f=%%a
    IF !COUNT! GTR 9 (
        set f=!f:^00 (=!
    ) ELSE (
        set f=!f:^0 (=!
    )
    set f=!f:^)=!
    ren "%%a" "!f!"
)
pause

然而,一旦我 运行 代码,我得到这个结果:

所以批处理文件不会像 Windows Explorer 显示的那样遍历文件 "intuitively"。有什么办法可以改变这个吗?或者是否有更好的方法来完全重命名这些文件?

这使用了不同的方法:

@echo off
cd C:\folder
setlocal enabledelayedexpansion

SET /A COUNT=0, REMOVE=2

for /F "delims=(" %%a in ('dir /B *.jpg') do (
    SET /A COUNT+=1
    ECHO !COUNT!
    set "f=%%a"
    IF !COUNT! EQU 10 SET "REMOVE=3"
    for /F %%r in ("!REMOVE!") do set "f=!f:~0,-%%r!"
    ren "%%a" "!f!!COUNT!.jpg"
)
pause

这是一种不依赖于文件系统使用的排序顺序的方法,保留原始文件名中出现的数字。

对于每个文件名(例如,test_this_01 SELR_Opening_00000 (1).jpg),检索最后一个下划线 _ 之后的部分 (00000 (1))。然后删除括号和 space,然后将长度缩减为五个字符 (00001)。该字符串最终替换了文件名中原来的字符串(test_this_01 SELR_Opening_00001.jpg);文件名不得多次包含替换部分 (00000 (1))(因此不应出现这样的文件名:test_this_00000 (1) SELR_Opening_00000 (1).jpg):

@echo off
setlocal DisableDelayedExpansion

rem // Define constants here:
set "LOCATION=."
set "PATTERN=*_* (*).jpg"
set /A "DIGITS=5"

pushd "%LOCATION%" || exit /B 1
for /F "usebackq eol=| delims=" %%F in (`
    dir /B /A:-D /O:D /T:C "%PATTERN%"
`) do (
    set "FILE=%%F"
    setlocal EnableDelayedExpansion
    set "LAST="
    for %%I in ("!FILE:_=","!") do (
        set "LAST=%%~nI" & set "FEXT=%%~xI"
        set "FNEW=!FILE:%%~I=!"
    )
    set "LAST=!LAST:(=!" & set "LAST=!LAST:)=!"
    set "LAST=!LAST: =!" & set "LAST=!LAST:~-5!"
    ECHO ren "!FILE!" "!FNEW!!LAST!!FEXT!"
    endlocal
)
popd

endlocal
exit /B

根据需要调整脚本顶部的目录位置和文件搜索模式。

测试后,删除大写 ECHO 命令 以便真正重命名文件。