0

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

  • 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 中的使用感到完全困惑和沮丧。任何人都可以帮忙吗?

4

2 回答 2

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 个字符长。

于 2012-07-25T19:02:33.820 回答
1

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

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

尝试澄清 for 语句: for
/f的 for 允许我们处理dir命令的输出。
告诉dos我们希望将tokens=1*空格之前的第一部分放入%%a,并将文件名的其余部分放入%%b (您可以使用其他选项作为标记,它会将这些部分放入后续字母中,向上最多 26个部分)我们希望空间作为部分之间的分隔符
的状态。delims=

因此,对于第一个列表, 当我们这样做时,2012-07-15 12.21.06.jpg它会放入2012-07-15%% a%%b12.21.06.jpg中,我们必须将空间放回原处,因为它在被分割成部分时被剥离,所以我们必须使用的move%%a %%b%%a%%b

于 2012-07-25T18:30:30.773 回答