1

我想根据创建日期而不是根据旧文件名对文件进行编号。

示例:假设以下文件按创建日期的降序排列。

A.jpg
D.jpg
B.jpg
C.jpg

我想重命名这些文件,这样

A.jpg becomes 4.jpg
D.jpg becomes 3.jpg
B.jpg becomes 2.jpg
C.jpg becomes 1.jpg

我使用的是 Windows 8,并根据创建日期对文件夹中的文件进行了排序。但是,当我尝试重命名文件时,DOS 会忽略排序并继续根据旧文件名重命名文件。

因此,

A.jpg becomes 1.jpg
D.jpg becomes 4.jpg
B.jpg becomes 2.jpg
C.jpg becomes 3.jpg

我正在使用以下代码(.bat 文件),该代码是从本网站的另一篇文章中获得的。

@Echo Off
setLocal EnableDelayedExpansion
set oldext=jpg
set newext=jpg
set index=0
for %%f IN (*.%oldext%) do (
    set /A index+=1
    set index=!index!
    ren "%%f" "!index!.%newext%"
)

我没有安装任何脚本工具,只使用记事本创建基本的 .bat 文件。

谢谢你的帮助。

4

1 回答 1

3

在 FAT 文件系统中,文件没有排序,它们按照包含在文件夹中的方式放置。在 NTFS 文件中是按字母顺序排列的。您可以更改查看文件的方式,但不能更改它们的物理排序方式。

for循环将按照它们存储的相同顺序遍历文件。如果您需要以不同的顺序进行迭代,您将需要按照您想要的顺序创建一个列表并遍历该列表。

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "oldext=jpg"
    set "newext=jpg"
    set "index=0"

    for /f "delims=" %%a in ('dir /a-d /b /od "*.%oldext%"') do (
        set /a "index+=1"
        setlocal enabledelayedexpansion
        for %%b in (!index!) do endlocal & ren "%%~fa" "%%b.%newext%"
    )

这里使用dir命令按所需顺序列出文件,然后该列表由for /f命令迭代。

包含内部setlocal enabledelayedexpansion / endlocal以处理!名称中包含字符的文件的情况。如果您知道这永远不会是您的情况,您可以直接使用

@echo off
    setlocal enableextensions enabledelayedexpansion

    set "oldext=jpg"
    set "newext=jpg"
    set "index=0"

    for /f "delims=" %%a in ('dir /a-d /b /od "*.%oldext%"') do (
        set /a "index+=1"
        ren "%%~fa" "!index!.%newext%"
    )

请注意,所包含的示例均不以任何方式处理重复文件名的可能性。

于 2015-07-05T15:03:29.603 回答