.bat文件将文件排序到文件夹中

时间:2012-07-25 16:22:11

标签: file sorting batch-file directory dos

对于我的图片集我想让文件夹中的所有图片按日期自动分类到文件夹中。幸运的是,文件已经以时间戳命名:

  • 2012-07-15 12.21.06.jpg
  • 2012-07-15 12.21.26.jpg
  • 2012-07-16 17.12.50.jpg

在此示例中,两个第一个文件应该在2012-07-15的文件夹中结束,第三个文件应该在2012-07-16中。我试过用谷歌搜索过,我能找到的就是这个:

for %%a in (*.jpg) do (
    md "%%~na" 2>nul
    move "%%a" "%%~na"
)

但是这会为每个文件名创建一个文件夹。我想过拥有一个具有十个第一个字符的变量,但是在变量声明和dos中使用时会变得完全混淆和沮丧。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

这是另一种可能性,你可以使用延迟扩展和子串来实现这一点:

SETLOCAL ENABLEDELAYEDEXPANSION
for %%a in (*.jpg) do (
    set f=%%a
    set g=!f:~0,10!
    md "!g!" 2>nul
    move "%%a" "!g!"
)

第一行使用!而不是%启用语法,并且具有解释变量值的效果,而不是执行块的第一行(标准批处理行为),但是只有当行本身被执行时才会出现。

!f:~0,10!是获取子字符串的语法 - 您所关注的日期总是10个字符。

答案 1 :(得分:1)

使用dir命令的输出,以便您可以在空格处分割文件名

for /f "tokens=1* delims= " %%a in ('dir /b *.jpg') do (
    md %%a 2>nul
    move "%%a %%b" %%a
)   

试图澄清for声明:
for中的/f允许我们处理dir命令的输出 tokens=1*告诉dos我们希望空格之前的第一部分放在 %% a 中,其余文件名放在 %% b < em>(你可以使用其他选项作为代币,它会将这些部分放入后续字母中,最多可以包含26个部分)
delims=个状态我们希望空格作为各部分之间的分隔符。

因此,对于第一个列表,2012-07-15 12.21.06.jpg会将2012-07-15加入 %% a ,将12.21.06.jpg加入 %% b 当我们执行move时,我们必须将空间重新放入,因为当它被拆分成部分时会被剥离,所以我们必须使用%%a %%b而不是%%a%%b