批处理脚本中的直观文件排序?
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
命令 以便真正重命名文件。
所以在 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
命令 以便真正重命名文件。