O script em lote a seguir pressupõe que:
- Todos os nomes de arquivos estão no formato
<name> - [...] - <some numbers> - <date> .
- Todos os anos estão no intervalo
2000-2099 .
Basta copiar e colar o código em um novo arquivo de texto e salvá-lo como MoveFiles.cmd (ou o que for, contanto que você mantenha o .cmd extensão ).
@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
Como funciona
-
Lista todos os arquivos .pdf na pasta atual.
-
Pegue cada nome de arquivo e tokenize .
-
Verifique se os caracteres recuperados são na verdade números:
A variável é ecoada e depois canalizada para o comando findstr , que usará um expressão regular para corresponder aos caracteres alfabéticos.
-
^ corresponde ao início da linha;
-
\" corresponde a um caractere de aspas diretas ( " );
-
[0-9] define uma classe de caracteres que corresponde a qualquer caractere de 0 a 9;
-
* repete zero ou mais ocorrências da classe anterior;
-
$ corresponde ao fim da linha.
Além disso, a expressão regular tentará corresponder o máximo possível de datas válidas. A variável !errorlevel! será definida como 0 se houver uma correspondência ou 1 caso contrário. A saída findstr será então redirecionada para nul , portanto, ignorada.
-
Crie a pasta de destino, caso ainda não exista.
-
Mova o arquivo atual para a pasta relacionada.
Leitura adicional
- Referência da linha de comando