通过在每个文件前面添加 [a-z][1-9] 来重命名目录中的所有文件

Rename all files in a directory by adding [a-z][1-9] in front of each file

我在将文件传输到的特定设备上遇到问题。此设备无法对文件进行排序以供使用,它始终使用 ascending a-z 排序。这会产生一个问题,我需要文件按创建日期 "processed" 来代替。

就是说,我想出了一个想法,以 .bat 文件的形式编写脚本,即我会将该脚本放入所有文件所在的目录中,并简单地 运行 它。

想法是脚本需要遍历所有文件,唯一的要求是它需要在开始之前按创建日期对文件 descending 进行排序。然后在迭代过程中需要重命名每个文件,以便在前面添加字母和数字。

结果如下:

a1-file-name.dat // created 5 min ago
...
a2-file-name.dat // created 10 min ago
...
a9-file-name.dat // created 15 min ago
b1-file-name.dat // created 20 min ago
...
b6-file-name.dat // created 25 min ago
...
b9-file-name.dat // created 30 min ago

对于 windows 脚本,我的经验和专业知识为零,因此我会寻求有关此脚本的帮助。

几个事实:

注意:我的第一次尝试完全错误(见评论)

DIR combined with a FOR 循环完成工作
不,它不能处理像 ! 这样的字符。在这种情况下,需要一个临时文件:

@echo off
====SETLOCAL EnableExtensions EnableDelayedExpansion


::Clear env
set "letters="
set "numbers="
set/a"#=#lines=posL=posN=0"
set "source="
set "tempFile=%TEMP%\getFiles.tmp"


::A-Z ASCII 97~122
FOR /L %%A in (97 1 122) do (
    "%ComSpec%"/c exit %%A
    set "letters=!letters!!=ExitCodeAscii!"
)
::1-9
FOR /L %%# in (1 1 9) do set "numbers=!numbers!%%#"


::Count #FILES
(dir /A-D /B /T:C /O-D) 1>"%tempFile%" 2>nul
set "getLines="%__APPDIR__%findstr.exe" /N "^^" "%tempFile%""
FOR /F %%L in ('"!getLines!"') do set/a"#lines+=1"


::Read from STDIN
pushd "%source%" || exit /b
setlocal DisableDelayedExpansion EnableExtensions
<"%tempFile%" (FOR /L %%L in (1 1 %#lines%) do (
    set "file="
    set/p"file="
    set/a^"#+=1,^%=Increase order by 1=%
    posL=(#/10^) %% 26,^%=Get position of # in LETTERS modulo 26=%
    posN=(# %% 9^)-1"%=From 1~9=%
    setlocal EnableDelayedExpansion
    FOR /F "tokens=1-2 delims= " %%A in ("!posL! !posN!") do (
        echo(REN "!file!" "!letters:~%%A,1!!numbers:~%%B,1!-!file!"
    ) %=Delete ECHO( to run for true=%
    endlocal
))


popd
endlocal
====ENDLOCAL


::Anything here...

FOR /L %%A in (97 1 122)循环%%A(ASCII码)从97到122。只读dynamic variable =ExitCodeAscii is discussed 。不是必须的,但是在遇到复杂情况的时候更灵活。

dir /a-d /b /o-d 我再试一次

dir /A-D /B /T:C /O-D 在当前目录中搜索文件,排除目录并根据创建日期排序。

我使用了一个额外的 FOR 循环,因为我想用一个变量替换另一个都需要延迟扩展的变量。

您可以使用类似于此代码的内容。唯一的问题是如果源文件夹有超过 234 个文件,那么所有 [a-z][1-9] 都允许 26 * 9 = 234 种可能性。 My Video.

@echo off
SetLocal EnableDelayedExpansion
set Source=%userprofile%\desktop\Test
set Letters=abcdefghijklmnopqrstuvwxyz
set Numbers=123456789
set /a CountL=0
set /a CountN=0

for /f "Delims=" %%a in ('dir /b /o-d /tc /s /a-d "%Source%"') do (
set /a TCounter+=1
set FileName=%%~nxa
set FullPath=%%~fa
Call :Rename
set /a CountN+=1
if !CountN! EQU 9 set /a CountN=0& set /a CountL+=1
if !TCounter! EQU 234 goto :Exit
)
:Exit
exit
:Rename
ren "!Fullpath!" "!Letters:~%CountL%,1!!Numbers:~%CountN%,1!!FileName!"
goto :EOF

这是 [a-z][a-z][1-9][1-9]filename.ext 版本:

@echo off
SetLocal EnableDelayedExpansion
set Source=%userprofile%\desktop\Test
set Letters=abcdefghijklmnopqrstuvwxyz
set Numbers=123456789
set /a CountL=0
set /a CountN=0
set /a CountL2=0
set /a CountN2=0

for /f "Delims=" %%a in ('dir /b /o-d /tc /s /a-d "%Source%"') do (

set FileName=%%~nxa
set FullPath=%%~fa
Call :Rename
set /a CountN2+=1
if !CountN2! EQU 9 set /a CountN2=0& set /a CountN+=1
IF !CountN! EQU 9 set /a CountN=0& set /a CountN2=0& set /a CountL2+=1
IF !CountL2! EQU 26 set /a CountL+=1
)
:Exit
exit
:Rename
ren "!Fullpath!" "!Letters:~%CountL%,1!!Letters:~%CountL2%,1!!Numbers:~%CountN%,1!!Numbers:~%CountN2%,1!!FileName!"
goto :EOF