将标有日期的文件移动到其对应的标有日期的文件夹中

将标有日期的文件移动到其对应的标有日期的文件夹中

我有 .pdf 文件,其名称末尾带有日期,例如“BINNAWAY - WERRIS CK - 483.94 - 120612”。

我有以每个文件的日期命名的文件夹,例如“12-06-2012”。

如何将所有文件移动到基​​于其名称中的日期的相应文件夹中?

我使用的是 Windows XP。

如果有任何建议我将非常感激。

谢谢

答案1

@and31415 您的代码在某些文件上有效。但是还有很多其他文件无法正常工作,因为并非所有文件都采用<name1> - <name2> - <some numbers> - <date>假定的格式。有些文件可能采用该格式<name1> - <some numbers> - <date>,或者采用其他略有不同的格式。但是,所有文件都将以 结尾- <date>,可能的排列如下:“- 120612”、“- 120612 (1)”、“- 120612 (2)”或“- 无日期”。我怎样才能使它只考虑最后一个连字符后的文本?

感谢您的所有帮助。

迈克尔

答案2

您好,我只是想更新一下我取得的进展,并对我自己的问题提供一些反馈。为了解释具有命名格式的文件,<name1> - <some numbers> - <date> 而不是<name1> - <name2> - <some numbers> - <date>@and31415在他提供的脚本中假设的格式,我刚刚在一个新的.cmd文件中进行了更改tokens=4tokens=3这有效。但是,这些批处理脚本仍然没有处理许多文件。我发现脚本只处理了文件夹中的一些文件(它只处理了50到100个pdf文件,而我有数千个pdf文件要处理),所以我创建了一个新文件夹,将多余的pdf转储到其中,然后在其中运行批处理脚本。仍然有许多pdf文件未处理,但我正在处理它们,每个文件在新文件夹中处理50-100个pdf,应该很快就能完成。虽然不理想,但还是比一个一个手动处理要好得多!感谢@and31415的帮助:)

答案3

以下批处理脚本假定:

  • 所有文件名都采用 格式<name> - [...] - <some numbers> - <date>
  • 所有年份都在范围内2000-2099

只需将代码复制并粘贴到新的文本文件中,然后将其另存为MoveFiles.cmd(或任何名称,只要您保留.cmd 扩大)。

@echo off
setlocal
setlocal enabledelayedexpansion

for /r %%A in (*.pdf) do (
set date=
call :getLastToken "%%~nA"
for /f "tokens=1" %%B in ("!last!") do set date=%%~B
echo "!date!"|findstr "^\"[0-3][0-9][0-1][0-9]*\"$" >nul
if !errorlevel! == 0 (
set targetFolder=!date:~0,2!-!date:~2,2!-20!date:~4,2!
if not exist "!targetFolder!\" md "!targetFolder!"
move "%%~fA" "!targetFolder!" >nul
))

endlocal & exit /b

:getLastToken
set "str=%~1"
:loop
for /f "tokens=1* delims=-" %%A in ("%str%") do (
set "last=%%A"
set "str=%%B"
)
if defined str goto :loop
exit /b

怎么运行的

  1. 列出.pdf当前文件夹中的所有文件。

  2. 获取每个文件名并标记化它。

  3. 确保检索到的字符实际上是数字:

    变量被回显,然后管道findstr命令,它将使用正则表达式匹配字母字符。

    • ^匹配行首;
    • \"匹配直引号字符 ( ");
    • [0-9]定义了一个字符类匹配 0 到 9 之间的任意字符;
    • *重复前一类的零次或多次出现;
    • $匹配行尾。

    此外,正则表达式将尝试匹配尽可能多的有效日期。如果匹配,!errorlevel!则将变量设置为,否则。然后输出将重定向到,因此被忽略。01findstrnul

  4. 如果目标文件夹不存在,则创建它。

  5. 将当前文件移动到相关文件夹。

进一步阅读

相关内容