批量文件按修改日期移动文件

时间:2011-12-13 11:25:41

标签: windows batch-file

我编写了一个批处理文件,为每个日期创建空文件夹。我的下一个任务是根据修改日期创建另一个批处理文件,该文件将目录中的每个文件移动到相关的日期文件夹中。我已经阅读了很多关于如何实现这一目标的论坛和文章,但由于我有限的批处理文件知识,我似乎无法让它工作。我目前拥有的代码如下所示,尽管这似乎没有提到修改日期。非常感谢任何帮助!

SET directory="\directory\path\archive"

FOR /f %%a in ('dir /b "%directory%"') do (

SET fdate=%%~Ta

MOVE "%directory%\%%a" "%directory%\%fdate%"

1 个答案:

答案 0 :(得分:11)

在您提供有关日期格式的更多信息之前,我无法给出明确的答案。但我可以告诉你我将如何在我的机器上完成它。

我在文件和文件夹名称中使用yyyy-mm-dd格式,因此2011年12月13日将是2011-12-13。我的机器使用mm / dd / yyyy格式表示日期(12/13/2011)。所以我需要将2011年12月13日的%% ~tF输出翻译成2011-12-13。 注意 - /不能用于文件或文件夹名称。

因此,此代码可以在我的机器上执行您想要的操作:

set "source=\directory\path\archive"
set "targetRoot=\directory\path\archive"
for %%F in ("%source%\*") do (
  for /f "tokens=1,2,3 delims=/ " %%A in ("%%~tF") do (
    move "%%~fF" "%targetRoot%\%%C-%%A-%%B"
  )
)

附录 - 评论中的问题询问左侧填充数字的方法,以创建目录。我看到两个简单的选择。 (这应该是一个不同的问题)

这第一种方法虽然简单但繁琐,但作为一般解决方案并不实用

for %%A in (01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31) do ...

第二种方法是一般解决方案。由于您的作业在括号内,因此您需要使用延迟扩展。

setlocal enableDelayedExpansion
for /l %%A in (1 1 31) do (
  set "day=0%%A"
  set "day=!day:~-2!
  ...
)

通过在前面添加更多0然后增加在子字符串操作中保留的字符数来增加前导零的数量。

但是 - 为什么要预先填充目录?您的策略将添加日历中不存在的目录日期,此外您可能还有许多未使用的文件夹,当天没有修改任何文件。最好只根据需要创建文件夹。然后为您完成了0填充,并且没有创建不需要的文件夹。

set "source=\directory\path\archive"
set "targetRoot=\directory\path\archive"
for %%F in ("%source%\*") do (
  for /f "tokens=1,2,3 delims=/ " %%A in ("%%~tF") do (
    if not exist "%targetRoot%\%%C\%%A\%%B" mkdir "%targetRoot%\%%C\%%A\%%B"
    move "%%~fF" "%targetRoot%\%%C\%%A\%%B"
  )
)