Пакетный скрипт для перемещения нескольких PDF-файлов на основе первого слова в папки, которые также имеют такое же первое слово, все в одном каталоге

Пакетный скрипт для перемещения нескольких PDF-файлов на основе первого слова в папки, которые также имеют такое же первое слово, все в одном каталоге

У меня есть куча файлов, хранящихся в одном каталоге, которые я хочу отсортировать по подпапкам в соответствии с первым словом в именах файлов.

Итак, у меня есть тысячи файлов в формате .pdf, у всех из которых разные первые слова (7 цифровых символов).

У меня также есть тысячи папок в одном и том же каталоге, в которых первые слова отличаются 7 цифрами.

Я пытаюсь переместить все файлы .pdf в папки, в которых первое слово одинаковое (7 символов).

Поэтому мне нужен пакетный файл, который по сути проверяет PDF-файл и проверяет в том же каталоге, существует ли уже папка с такими же первыми 7 цифрами, и если существует, перемещает PDF-файл в эту папку.

Если папка для файла .pdf не существует, она создается на основе первых семи символов файла .pdf.

Так, например, у меня есть pdf с именем "1617832_XXXXXXXX_XXX.pdf" и папка с именем "1617832_XXXXXXXXXX" в том же каталоге, я хочу, чтобы "1617832_XXXXXXXX_***.pdf" был перемещен в существующую папку "1617832_XXXXXXXX". Однако, если папка ""1617832_XXXXXXXX" не существует, я хочу создать папку с именем "1617832" (первые семь символов имени файла).

После этого он перейдет к следующему файлу .pdf «4530834__XXXXXXXXXX_XXX.pdf» и проверит папки, чтобы увидеть, есть ли соответствующая папка с таким же первым словом (семь символов), а затем переместит файл в эту папку (если она существует, в противном случае будет создана новая папка).

Единственный пакет, который близок к этому, но выполняется слишком долго и не создает папки, если их нет, — это:

@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
  )        
)

Есть ли способ сделать это более эффективно и действенно?

решение1

Проверьте это:

@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!"
)

введите описание изображения здесь

решение2

  • Обновленоучитывая этот комментарий:Да, если есть две папки, в которых совпадают первые 7 символов, я бы хотел, чтобы файл был перемещен в обе папки, в которых первые 7 символов совпадают.

Вы не можете использовать команду перемещения, поскольку перемещение сделает невозможным создание еще одной копии (перемещенного файла) в другой папке, где первые 7 символов совпадают, после перемещения... Команда должна будет создавать копии, а не перемещать файлы...


@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

Сначала обработайте папку и посмотрите, совпадают ли какие-либо файлы; после этого проверьте оставшиеся файлы в папке и без назначения.


Если все файлы были скопированы в соответствующую папку, вам нужно удалить это: Просто удалитеecho /команда:


(эхо/если существует .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF

Связанный контент