Answers:
@ and31415您的代码已经处理了一些文件。但还有许多其他地方没有用,因为所有文件都没有格式 <name1> - <name2> - <some numbers> - <date>
假设。有些可能是格式 <name1> - <some numbers> - <date>
或其他略有不同的东西。但是,所有文件都将以 - <date>
,在以下可能的安排中:“ - 120612”,“ - 120612(1)”,“ - 120612(2)”或“ - 无日期”。如何才能使其仅考虑最后一个连字符后面的文本?
感谢您的所有帮助。
迈克尔
您好我以为我会更新我所取得的进展并提供一些反馈给我自己的问题。使用命名格式考虑文件 <name1> - <some numbers> - <date>
代替 <name1> - <name2> - <some numbers> - <date>
正如@和31415在他提供的剧本中所假设的那样,我刚刚改变了 tokens=4
至 tokens=3
在一个新的.cmd文件中。这很有效。但是,这些批处理脚本仍未处理许多文件。我发现该脚本只处理文件夹中的一些文件(它只处理了50到100个pdf文件,我有数千个pdf文件要通过),所以我创建了一个新文件夹并将多余的pdf转储到那里并在那里运行批处理脚本。还有很多未经处理的pdf文件,但我正在通过它们在一个新文件夹中处理50-100 pdf,它应该很快完成。不理想,但仍比手动逐一做得好!谢谢你的帮助@ and31415 :)
以下批处理脚本假定:
<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
因此被忽略了。
如果目标文件夹不存在,请创建它。
将当前文件移动到相关文件夹。
- <date>
。