我有 .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=4
。tokens=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
怎么运行的
列出
.pdf
当前文件夹中的所有文件。获取每个文件名并标记化它。
确保检索到的字符实际上是数字:
变量被回显,然后管道到
findstr
命令,它将使用正则表达式匹配字母字符。^
匹配行首;\"
匹配直引号字符 ("
);[0-9]
定义了一个字符类匹配 0 到 9 之间的任意字符;*
重复前一类的零次或多次出现;$
匹配行尾。
此外,正则表达式将尝试匹配尽可能多的有效日期。如果匹配,
!errorlevel!
则将变量设置为,否则。然后输出将重定向到,因此被忽略。0
1
findstr
nul
如果目标文件夹不存在,则创建它。
将当前文件移动到相关文件夹。