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