
У меня есть куча файлов, хранящихся в одном каталоге, которые я хочу отсортировать по подпапкам в соответствии с первым словом в именах файлов.
Итак, у меня есть тысячи файлов в формате .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