将日期文件移动到相应的日期文件夹中


3

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

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

如何根据名称中的日期将所有文件移动到相应的文件夹中?

我在Windows XP上。

非常感谢任何建议。

谢谢

Answers:


1

@ and31415您的代码已经处理了一些文件。但还有许多其他地方没有用,因为所有文件都没有格式 <name1> - <name2> - <some numbers> - <date> 假设。有些可能是格式 <name1> - <some numbers> - <date> 或其他略有不同的东西。但是,所有文件都将以 - <date>,在以下可能的安排中:“ - 120612”,“ - 120612(1)”,“ - 120612(2)”或“ - 无日期”。如何才能使其仅考虑最后一个连字符后面的文本?

感谢您的所有帮助。

迈克尔


0

您好我以为我会更新我所取得的进展并提供一些反馈给我自己的问题。使用命名格式考虑文件 <name1> - <some numbers> - <date> 代替 <name1> - <name2> - <some numbers> - <date> 正如@和31415在他提供的剧本中所假设的那样,我刚刚改变了 tokens=4tokens=3 在一个新的.cmd文件中。这很有效。但是,这些批处理脚本仍未处理许多文件。我发现该脚本只处理文件夹中的一些文件(它只处理了50到100个pdf文件,我有数千个pdf文件要通过),所以我创建了一个新文件夹并将多余的pdf转储到那里并在那里运行批处理脚本。还有很多未经处理的pdf文件,但我正在通过它们在一个新文件夹中处理50-100 pdf,它应该很快完成。不理想,但仍比手动逐一做得好!谢谢你的帮助@ and31415 :)


我已经更新了我的原始脚本,使其适用于任何以。结尾的文件 - <date>
and31415

0

以下批处理脚本假定:

  • 所有文件名都采用格式 <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! 变量将设置为 0 如果有匹配,或者 1 除此以外。该 findstr 输出将被重定向到 nul因此被忽略了。

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

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

进一步阅读


一些文件也可以标题为:“BINNAWAY - WERRIS CK - 483.94 - 120612(1)”或“BINNAWAY - WERRIS CK - 483.94 - 120612(2)”或“BINNAWAY - WERRIS CK - 483.94 - No Date”但是没有'这些太多了所以我很乐意只移动那些在日期结束的那些,例如“BINNAWAY - WERRIS CK - 483.94 - 120612”。此外,我打开了包含所有pdf文件的文件夹并在命令提示符下运行脚本(我假设这是脚本的用途)但没有任何反应。您的脚本是否假定我需要在某处指定包含所有日期文件夹的文件夹?
user309970

@ user309970我改进了脚本来处理名为的文件 BINNAWAY - WERRIS CK - 483.94 - 120612 (1),我修复了与日期检索相关的错误。没有有效号码的文件将不会被移动。也许我没有说清楚,但作为一个批处理脚本它并不意味着按原样运行:你需要将代码保存在一个新的文本文件中并确保 延期 .cmd。然后,您只需将批处理脚本移动到包含该文件夹的文件夹即可 .pdf 文件,然后双击它以执行其代码。使用Windows XP和7成功测试。
and31415
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.