我写了一个批处理文件,它为每个日期创建空文件夹。我的下一个任务是创建另一个批处理文件,它根据文件的修改日期将目录中的每个文件移动到相关的日期文件夹中。我已经阅读了很多关于如何实现这一点的论坛和文章,但由于我对批处理文件的了解有限,我似乎无法让它发挥作用。我目前拥有的代码如下所示,尽管这似乎没有包含修改日期。非常感谢任何帮助!
SET directory="\directory\path\archive"
FOR /f %%a in ('dir /b "%directory%"') do (
SET fdate=%%~Ta
MOVE "%directory%\%%a" "%directory%\%fdate%"
最佳答案
除非您提供有关日期格式的更多信息,否则我无法给出明确的答案。但我可以向您展示如何在我的机器上执行此操作。
我在文件和文件夹名称中使用 yyyy-mm-dd 格式,因此 2011 年 12 月 13 日将是 2011-12-13。我的机器对日期使用 mm/dd/yyyy 格式 (12/13/2011)。所以我需要将 12/13/2011 的 %%~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"
)
)
关于windows - 批处理文件按修改日期移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8488363/