【问题标题】:Windows Batch Scripting ~ How to MOVE Files to New Folder based on File DateWindows 批处理脚本 ~ 如何根据文件日期将文件移动到新文件夹
【发布时间】:2017-04-16 19:51:47
【问题描述】:

我正在尝试处理一个文件夹中的所有文件,如下所示:

IMG_20161216_202848.jpg

IMG_20161216_203848.jpg

IMG_20161101_102848.jpg

IMG_20161102_112848.jpg

要移动到这样的文件结构中:

2016 年 12 月

-- IMG_20161216_202848.jpg

-- IMG_20161216_203848.jpg

2016 年 11 月

-- IMG_20161101_102848.jpg

-- IMG_20161102_112848.jpg

如您所见,有一个顶级文件夹,其中包含月份 - 年份名称和文件的子内容。我希望从文件的上次修改日期获得顶级文件夹的月份和年份。需要递归提取文件,然后将它们全部放入上述结构中;不再递归。不会有任何文件名重复,如果有就覆盖它。

什么是 Windows Batch Script 命令来实现上述功能?

作为记录,我对一个也可以执行此操作的 Windows 应用程序持开放态度 - 我使用一些参数对其进行了设置,并且它适用于所有文件。

谢谢。

【问题讨论】:

    标签: windows file batch-file scripting command


    【解决方案1】:
    @ECHO Off
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "sourcedir=U:\sourcedir"
    SET "destdir=U:\destdir"
    FOR /f "tokens=1-3delims=_" %%a IN (
     'dir /b /a-d "%sourcedir%\IMG_*_*.jpg" '
     ) DO IF "%%c" neq "" (
      SET /a dmonth="(%%b / 100) %% 100"
      SET /a dyear=%%b / 10000
      FOR %%m IN (January February March April May June
       July August September October November December) DO SET /a dmonth-=1&IF !dmonth!==0 (
       ECHO MD "%destdir%\%%m !dyear!" 2>nul
       ECHO MOVE "%sourcedir%\%%a_%%b_%%c" "%destdir%\%%m !dyear!\"
      )
    )
    
    GOTO :EOF
    

    您需要更改sourcedirdestdir 的设置以适应您的情况。

    所需的 MOVE 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO MOVE 更改为MOVE 以实际移动文件。附加>nul 以禁止报告消息(例如1 file moved

    所需的 MD 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(MD 更改为MD 以实际创建目录。如图所示附加2>nul 以抑制错误消息(例如,当目录已存在时)

    此过程假定与 IMG_*_*.jpg 文件掩码匹配的所有文件名都是严格的 IMG_8numerics_whatever.jpg。

    读取每个源文件名并标记_。取%%b 中的第二个标记除以 100 并计算 mod 100 给出月份。将%%b 中的日期除以给出年份的 10000。对于每个月份名称,递减 dmonth,如果 dmonth 变为零,则 %%m 将包含月份名称作为文本,因此使目录忽略错误消息并移动文件。


    为了适应子目录扫描和另一个文件掩码(请注意,这些看似微小的更改可能需要完全不同的方法)

    @ECHO Off
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "sourcedir=U:\sourcedir"
    SET "destdir=U:\destdir"
    FOR /f "tokens=1-3delims=_" %%a IN (
     'dir /b /s /a-d "%sourcedir%\IMG_*_*.jpg" "%sourcedir%\VID_*_*.mp4" '
     ) DO IF "%%c" neq "" (
      SET /a dmonth="(%%b / 100) %% 100"
      SET /a dyear=%%b / 10000
      FOR %%m IN (January February March April May June
       July August September October November December) DO SET /a dmonth-=1&IF !dmonth!==0 (
       ECHO MD "%destdir%\%%m !dyear!" 2>nul
       ECHO MOVE "%%a_%%b_%%c" "%destdir%\%%m !dyear!\"
      )
    )
    
    GOTO :EOF
    

    [未经测试]

    【讨论】:

    • 好东西!另一件事,你可以让它处理子目录和 VID__.mp4(与 IMG 格式相同,但它以 VID 开头并以 mp4 结尾)。与此同时,我将查看有关所有深奥命令的文档。
    • 谢谢。好东西!本来要问如何根据上次修改日期而不是使用文件名来实现上述目标,但这足以满足我的需求。我将使用您提供的内容并从中学习。谢谢!
    【解决方案2】:

    由于您已明确允许建议使用 Windows 工具来完成此任务,因此我推荐 Naru (http://hp.vector.co.jp/authors/VA014830/english/FlexRena/) 的程序“FlexibleRenamer”。

    重命名文件和移动文件基本上是相同的操作,您可以使用此程序查找文件夹树中的所有图像文件,使用文件名的一部分或上次访问日期来构建新的子文件夹并移动他们进入那个文件夹。对于 *.mp3 等其他文件,它甚至可以读取和使用 MP3 标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多