Script em lote para mover vários arquivos PDF com base na primeira palavra para pastas que também possuem a mesma primeira palavra, todos no mesmo diretório

Script em lote para mover vários arquivos PDF com base na primeira palavra para pastas que também possuem a mesma primeira palavra, todos no mesmo diretório

Tenho muitos arquivos armazenados em um único diretório que desejo classificar em subpastas com base no primeiro mundo em seus nomes de arquivos.

Portanto, tenho milhares de arquivos .pdf, todos com primeiras palavras diferentes (7 caracteres numéricos).

Também tenho milhares de pastas com primeiras palavras diferentes e 7 caracteres numéricos no mesmo diretório.

Estou tentando mover todos os .pdfs para pastas que possuem a mesma primeira palavra (7 caracteres).

Portanto, preciso de um arquivo em lote que essencialmente verifique um arquivo pdf e verifique no mesmo diretório para ver se já existe uma pasta com os mesmos 7 primeiros caracteres numéricos e, se existir, mova o .pdf para essa pasta.

Se não existir uma pasta para o .pdf, será criada uma pasta com base nos primeiros sete caracteres do arquivo .pdf.

Então, por exemplo, eu tenho um pdf chamado "1617832_XXXXXXXX_XXX.pdf" e uma pasta chamada "1617832_XXXXXXXX" no mesmo diretório, quero que "1617832_XXXXXXXX_***.pdf" seja movido para a pasta existente "1617832_XXXXXXXX". No entanto, se a pasta ""1617832_XXXXXXXX" não existir, desejo criar uma pasta com o título "1617832" (os primeiros sete caracteres do arquivo).

Depois de fazer isso, ele passaria para o próximo .pdf "4530834__XXXXXXXXX_XXX.pdf" e verificaria as pastas para ver se há uma pasta correspondente que tenha a mesma primeira palavra (sete caracteres) e depois moveria o arquivo para essa pasta (se existe, caso contrário, cria uma nova pasta).

O único lote que chega perto, mas demora muito para ser executado e não cria pastas se elas não existirem, é este:

@echo on
setlocal enabledelayedexpansion
cls

pushd c:\folders\

for /f "tokens=*" %%1 in ('dir /a-d /b *') do (
set filename=%%1&set dirname=!filename:~0,7!

for /f "tokens=*" %%A in ('dir /ad /b') do (
    set dirid=%%A&set dirid=!dirid:~0,7!

if "!dirid!" equ "!dirname!" move %%1 %%A
  )        
)

Alguma maneira de fazer isso de forma mais eficiente e eficaz?

Responder1

Teste isso:

@echo off
setlocal EnableDelayedExpansion

REM Put here the path where the PDFs are:
set "Source=%userprofile%\Desktop\test"

for %%a in ("%Source%\*.PDF") do (
set "File=%%~na"
for /d %%b in ("%Source%\*") do (
set "Folder=%%~nb"
If "!File:~0,7!"=="!Folder:~0,7!" Move "%%a" "%%b"
)
if Exist "%%a" md "!Source!\!File:~0,7!"& move /y "%%a" "!Source!\!File:~0,7!"
)

insira a descrição da imagem aqui

Responder2

  • Atualizadaconsiderando este comentário:Sim, se houver duas pastas que correspondam aos primeiros 7 caracteres, eu gostaria que o arquivo fosse movido para ambas as pastas que tivessem os mesmos primeiros 7 caracteres

Você não pode usar o comando mover porque mover impossibilitará fazer outra cópia dele (arquivo movido) para outra pasta onde os 7 primeiros caracteres correspondam, após ser movido ... O comando teria que fazer cópias, não mover arquivos. ..


@echo off && setlocal enabledelayedexpansion 

cd /d "O:\Path\Operations\Blank\Blanky\Blank Blank" && cls 

for /f tokens^=* %%i in ('dir /a:d .\* /b ')do set "_folder=%%~ni" && if exist ".\%%~ni*.pdf" (
for /f tokens^=* %%F in ('dir /a:d /b ".\!_folder:~0,7!*"')do copy ".\%%~ni*.pdf" "%%~dpnF\." )

for %%F in (*.pdf)do set "_file=%%~nF" && call set "_file=!_file:~0,7!" && (
if not exist .\!_file!\. md .\!_file!\ && copy /y "%%~dpnxF" ".\!_file!\." )

:: Deleting these files was copied to multiple folders instead of being moved to folder...
(echo/ if exist .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF

Primeiro trate a pasta e veja se algum arquivo corresponde; depois disso, verifique os arquivos restantes na pasta e sem destino


Se todos os arquivos foram copiados para a respectiva pasta, você precisa excluir isto: Basta remover oecho /comando:


(eco/se existir .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF

informação relacionada