1

Тема: CMD/BAT: Поиск и перемещение папок по имени файла

Добрый день
Имеется ресурс (папка с общим доступом - d:\Arhiv), в которую постоянно складывается большое количество архивов в формате RAR или ZIP для пользователей. Пользователи разархивируют эти архивы, создавая на этом же ресурсе папки, имеющие имя разархивируемого файла. Иногда содержимое этих папок они копируют (переносят) себе на компьютер, удаляя так же и исходный архив, но чаще оставляют и папку и породивший её архив, либо удаляют что-то одно. В результате на ресурсе скапливается куча и архивов и папок и не понятно, что пользователи уже смотрели, что нет, что удалили, что забыли удалить.
Стоит задача - сделать так, чтобы на этом ресурсе постоянно хранились только архивы, т. е.  создать скрипт, который бы периодически запускался и искал на данном ресурсе по имени каждой существующей там папки (первого уровня, конечно, так как внутри может быть ещё куча папок и файлов) файл архива, имеющий соответствующее данной папке имя, из которого эта папка и была создана. В случае нахождения архива с таким же именем, что и папка, архив нужно переместить в папку  d:\ReadFile ,  а саму папку со всем её содержимым в другую папку, допустим в d:\ReadFolder. А если архива с таким названием нет (пользователь его удалил сам), то эту папку со всем содержимом надо перенести в  третью папку - D:\FolderOnly . В результате на ресурсе всегда должны оставаться только неразархивированные файлы RAR или ZIP.
Спасибо

2

Re: CMD/BAT: Поиск и перемещение папок по имени файла

Если папки d:\ReadFile, d:\ReadFolder, d:\FolderOnly уже существуют (иначе результат может отличаться, но дальше разрабатывать эту линию я не буду), то как-то так (не проверялось):

for /d %%d in (d:\Archive\*) do  for %%x in (zip rar) do  if exist "%%~d.%%x" (
    move "%%~d.%%x" d:\ReadFile
    move "%%~d" d:\ReadFolder
) else move "%%~d" d:\FolderOnly

3

Re: CMD/BAT: Поиск и перемещение папок по имени файла

Спасибо. Работает, но не могу понять, почему-то  в папку d:\FolderOnly переносит папки, у которых есть исходный файл архива. Т.е. файлы архивов переносит все правильно, а вот часть папок, соответствующих этим архивам переносит почему то вместо папки d:\ReadFolder в папку d:\FolderOnly. Причем пытался файлы переименовывать и снова разархивировать - все равно попадают в d:\FolderOnly вместо d:\ReadFolder именно эти папки, независимо от имени. Что не так?

4 (изменено: Мальчик-гей, 2015-03-17 03:20:32)

Re: CMD/BAT: Поиск и перемещение папок по имени файла

Если это так, то  самому интересно, в чём может быть дело.
А так

for /d %%d in (d:\Archive\*) do (
    if exist "%%~d.zip" (

        move "%%~d.zip" d:\ReadFile
        move "%%~d" d:\ReadFolder

    ) else if exist "%%~d.rar" (

        move "%%~d.rar" d:\ReadFile
        move "%%~d" d:\ReadFolder

    ) else move "%%~d" d:\FolderOnly
)

?

5

Re: CMD/BAT: Поиск и перемещение папок по имени файла

Спасибо большое, сейчас работает четко по нужному алгоритму. Я ещё добавил строки типа - echo Перенесли папку "%%~d" в d:\ReadFolder>>"sort.txt" для формирования текстового файла-отчета со списком перенесенных файлов и папок. Не подскажете, как убрать из него пути, чтобы были только имена файлов? В DIR есть ключи, а тут как?

6

Re: CMD/BAT: Поиск и перемещение папок по имени файла

1) Сделать папку d:\Archive текущей - пути будут относительными, т.е заменить

for /d %%d in (d:\Archive\*) do (
    . . .
)

на

pushd d:\Archive

for /d %%d in (*) do (
    . . .
)

popd

2) Или см.

for /?

. . .
При объединении нескольких операторов можно получить следующие результаты:

    %~dpI       - переменная %I заменяется только на имя диска и путь
    %~nxI       - переменная %I заменяется только на имя файла и его
                   расширение
. . .

т.е.

echo Перенесли папку "%%~nxd" в d:\ReadFolder>>"sort.txt"