Windows 批处理脚本 ~ 如何根据文件日期将文件移动到新文件夹
Windows Batch Scripting ~ How to MOVE Files to New Folder based on File Date
我正在尝试处理文件夹中的所有文件,如下所示:
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批处理脚本命令是什么?
郑重声明,我对 Windows 也可以执行此操作的应用程序持开放态度 -- 我使用一些参数对其进行了设置,并针对所有文件执行此操作。
谢谢。
@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
您需要更改 sourcedir
和 destdir
的设置以适合您的情况。
所需的 MOVE 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将ECHO MOVE
更改为MOVE
以实际移动文件。附加 >nul
以禁止报告消息(例如 1 file moved
)
所需的 MD 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将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
[未经测试]
由于您已明确允许 Windows 工具的建议来完成此任务,因此我推荐 Naru (http://hp.vector.co.jp/authors/VA014830/english/FlexRena/) 的程序 'FlexibleRenamer'。
由于重命名文件和移动文件基本上是相同的操作,您可以使用此程序查找例如文件夹树中的所有图像文件,使用文件名的一部分或最后访问日期来构建新的子文件夹并将它们移动到该文件夹中。对于 *.mp3 等其他文件,它甚至可以读取和使用 MP3 标签。
我正在尝试处理文件夹中的所有文件,如下所示:
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批处理脚本命令是什么?
郑重声明,我对 Windows 也可以执行此操作的应用程序持开放态度 -- 我使用一些参数对其进行了设置,并针对所有文件执行此操作。
谢谢。
@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
您需要更改 sourcedir
和 destdir
的设置以适合您的情况。
所需的 MOVE 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将ECHO MOVE
更改为MOVE
以实际移动文件。附加 >nul
以禁止报告消息(例如 1 file moved
)
所需的 MD 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将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
[未经测试]
由于您已明确允许 Windows 工具的建议来完成此任务,因此我推荐 Naru (http://hp.vector.co.jp/authors/VA014830/english/FlexRena/) 的程序 'FlexibleRenamer'。
由于重命名文件和移动文件基本上是相同的操作,您可以使用此程序查找例如文件夹树中的所有图像文件,使用文件名的一部分或最后访问日期来构建新的子文件夹并将它们移动到该文件夹中。对于 *.mp3 等其他文件,它甚至可以读取和使用 MP3 标签。