1

У меня есть несколько .pdf и .jpg-файлов, которые мне нужно переместить.

Они названы как-то так

002-054*.pdf
042-021*.pdf

* будучи некоторым аффиксом.

Теперь я хочу переместить эти файлы в такие папки

002\002 - 054\002-054*.pdf
042\042 - 021\042-021*.pdf

Некоторые папки уже существуют, но в этой схеме именования 002\002 - 054 Some Name\

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

Через некоторое прибегая к помощи я смог собрать что-то вместе

@echo off
for %%F in (*.pdf *.jpg) do call :subr "%%F"
exit /b

:subr
set filename=%1
move %1 %filename:~1,3%\%filename:~1,7%\
exit /b

Но это не учитывает папки, которые уже существуют. Каков наилучший способ сделать это?

2 ответа2

2

Вам просто нужно добавить пару строк в подпрограмму:-

:subr
set filename=%1
Rem Check for existence of directories in target path
if not exist %filename:~1,3% md %filename:~1,3%
if not exist %filename:~1,3%\%filename:~1,7% md %filename:~1,3%\%filename:~1,7%
Rem Now the move can proceed
move %1 %filename:~1,3%\%filename:~1,7%\
exit /b

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

0

При условии, что папка должна быть создана в текущем каталоге
и папка 2-го уровня имеет - между числами:

@echo off
for /f "delims=" %%F in (
  'Dir /b *.pdf *.jpg^|findstr "^[0-9][0-9][0-9]-[0-9][0-9][0-9]" '
) do call :subr "%%F"
exit /b

:subr
set "file=%~n1"
set "fold=%file:~0,3%\%file:~0,3% - %file:~4,3%\"
if not exist "%fold%" md "%fold%"
move %1 "%fold%"

Изменения for и dir |findstr предназначены для того, чтобы обрабатывать только файлы, начиная с номера 999-999.
Поскольку md создает промежуточные папки, нужен только один md.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .