Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Разложить файлы из кучи по каталогам согласно образцу (http://forum.oszone.net/showthread.php?t=201678)

Maartimus 11-03-2011 00:26 1631985

Разложить файлы из кучи по каталогам согласно образцу
 
Помогите, пожалуйста, решить следующую задачу: нужно из общей свалки файлов разложить их по каталогам, согласно образцу.

Поясню на примере:

1. Есть каталог-образец. Он содержит следующие файлы
D:/страны_образец/Европа/Германия.txt
D:/страны_образец/Европа/Франция.txt
D:/страны_образец/Европа/Россия.txt
D:/страны_образец/Африка/Египет.txt
D:/страны_образец/Африка/Кения.txt
2. Есть исходный каталог, с которым надо работать. Он содержит следующие файлы:
D:/страны_разрбрать/Германия.txt
D:/страны_разрбрать/Россия.txt
D:/страны_разрбрать/Кения.txt
3. Нужно получить 3-ий каталог со следующей структурой (берем файл и переносим его в каталожную структуру согласно образцу):
D:/страны_разобраны/Европа/Германия.txt
D:/страны_разобраны/Европа/Россия.txt
D:/страны_разобраны/Африка/Кения.txt
Важное замечание: В каталоге Страны_Разобрать не могуть быть файлы, отсутствующие в каталоге страны_образец.

SendMessage 11-03-2011 06:26 1632059

Код:

@echo off

set "FPattern=D:\страны_образец"
set "FIn=D:\страны_разрбрать"
set "FOut=D:\страны_разобраны"

for /f "delims=" %%a in ('dir /s/b/a-d "%FIn%\*.txt"') do (
  for /f "tokens=3 delims=\" %%b in ('dir /a-d/b/s "%FPattern%\%%~nxa"') do (
      if not exist "%FOut%\%%b" md "%FOut%\%%b"
      move "%%a" "%FOut%\%%b"
  )
)

tokens=number в зависимости от глубины нахождения папок с континентами. В данном случае 3.

Maartimus 11-03-2011 11:15 1632202

Цитата:

tokens=number в зависимости от глубины нахождения папок с континентами. В данном случае 3.
Спасибо, @SendMessage.
Попробовал этот скрипт.
Создал описанную мной структуру, создал батник, в который вставил приложенный код. Запускаю. Окно cmd открывается и сразу закрывается. Каталог страны_разобраны пуст.

Я что-то делаю неправильно?
Как мониторить работу скрипта?
Можно ли вставить отладочные сообщения, которые требуют нажатия, например, пробела?

SendMessage 11-03-2011 11:57 1632247

Цитата:

Цитата Maartimus
Попробовал этот скрипт.
Создал описанную мной структуру, создал батник, в который вставил приложенный код. Запускаю. Окно cmd открывается и сразу закрывается. Каталог страны_разобраны пуст.
Я что-то делаю неправильно? »

Откуда мне знать? Вы ведь не привели код своего батника.
Я, со своей стороны, прежде чем писать скрипт, всегда его проверяю - у меня отработал без проблем.
Цитата:

Цитата Maartimus
Как мониторить работу скрипта?
Можно ли вставить отладочные сообщения, которые требуют нажатия, например, пробела? »

Закомментировать ::@echo off.
Поставить pause после строчек, которые вызывают подозрения на некорректность работы.

PS. Кстати, сейчас заметил, у Вас слэш в другую сторону смотрит. Вы так и пишете?
Код:

D:/страны_образец/Европа/

Maartimus 11-03-2011 14:17 1632368

Вложений: 1
  • 11.03.png (12.00 KB, скачиваний: 28)
Слэши смотрят в правильную сторону, я скопипастил Ваш код, поменяв только логический диск в адресе.

Поставил паузу в конце выполнения скрипта и снял скриншот окна cmd.

Судя по нему, происходит некорректная работа с русскими символами. Как это решить?

Iska 11-03-2011 14:36 1632378

Maartimus, пакетные файлы надо сохранять в кодировке 866 любым поддерживающим это редактором.

Maartimus 11-03-2011 14:57 1632394

Вложений: 3
Цитата:

Цитата Iska
пакетные файлы надо сохранять в кодировке 866 любым поддерживающим это редактором. »

Сделал -- помогло, спасибо.
Скрипт отрабатывает, файлы, судя по всему находит, но не перемещает.
Как выловить проблему?

Прикладываю скриншот скрипта, total commander и результат работы cmd

SendMessage 12-03-2011 03:07 1632945

Maartimus, а почему у вас tokens=10 стоит? Когда, судя по скриншоту ТС, нужно 3 - как у меня в скрипте и написано.

SendMessage 12-03-2011 03:45 1632950

Не хотелось усложнять скрипт, но придется. Теперь Вам не надо ничего править, кроме (если нужно) путей, по которым находятся Ваши папки.
Код:

@echo off

setlocal enabledelayedexpansion

set "FPattern=D:\страны_образец"
set "FIn=D:\страны_разрбрать"
set "FOut=D:\страны_разобраны"

for /f "delims=" %%a in ('dir /s/b/a-d "%FIn%\*.txt"') do (
  for /f "delims=" %%b in ('dir /a-d/b/s "%FPattern%\%%~nxa"') do set "fp=%%~dpb" & call:MoveFile "!fp:~,-1!" "%%a"
)

goto:eof

:MoveFile
if not exist "%FOut%\%~n1" md "%FOut%\%~n1"
move %2 "%FOut%\%~n1"
exit /b


Maartimus 12-03-2011 11:32 1633084

Цитата:

Цитата SendMessage
Maartimus, а почему у вас tokens=10 стоит? Когда, судя по скриншоту ТС, нужно 3 - как у меня в скрипте и написано. »


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

SendMessage 12-03-2011 11:51 1633101

Цитата:

Цитата Maartimus
В реальной задаче каталогов больше. Увеличил, чтобы потом не забыть. Это ведь влияет на глубину просмотра, но не на логику, так что из-за этого дополнительных проблем быть не должно. »

Проблемы будут, если не будет точного совпадения по глубине. Чем этот мой скрипт и плох. Он не универсален. Но в последней редакции берется именно последний по глубине каталог - и здесь уже проблем не должно возникать (я надеюсь :) ).

Maartimus 12-03-2011 12:17 1633123

Цитата:

Цитата SendMessage
Проблемы будут, если не будет точного совпадения по глубине. Чем этот мой скрипт и плох. Он не универсален. Но в последней редакции берется именно последний по глубине каталог - и здесь уже проблем не должно возникать (я надеюсь ). »

Тогда понятно почему у меня не заработало :).
Правильная поговорка есть "работает -- не трогай", но я её не послушал. :)
Зато теперь есть вторая редакция скрипта. Сейчас протестирую. Отпишу о результатах.

Все работает как нужно.

Спасибо!

Maartimus 14-03-2011 11:12 1634454

Ещё вопрос.
А как сохранить структуру вложенности каталогов?

Например.

Каталог-образец:
D:\страны_образец\eвропа\россия\московская_область\балашиха.txt
D:\страны_образец\eвропа\россия.txt
Исходный каталог:
D:\страны_разрбрать\балашиха.txt
D:\страны_разрбрать\россия.txt
Последний вариант скрипта возвращает:
D:\страны_образец\московская_область\балашиха.txt
D:\страны_образец\eвропа\россия.txt
То есть отсутствует часть каталога, выделенного жирным в каталоге-образце.
Подскажите изменения, для сохранения полного пути?

Maartimus 16-03-2011 11:30 1636063

Может кто-нибудь помочь с кодом?

sov44 14-07-2012 11:26 1951615

Необходимо разложить файлы по 10 штук в папку. Папки создавать по потребности. Скрипт написал, но почему-то количество файлов в папках не равняется 10. Подскажите, где ошибка?
Код:

@echo off
setlocal enabledelayedexpansion
set maxfiles=10
set dr="c:\перевалка"
set m=1
md "%~dp0name%m%"
for /f "delims=" %%a in ('dir "%dr%" /b/a-d') do (
  if not exist "%~dp0name!m!" md "%~dp0name!m!"
  set /a n +=1
  if "!n!"=="%maxfiles%" (set n=&set /a m +=1) else (copy "%dr%\%%a" "%~dp0name!m!")
)
pause


kiripanda 14-07-2012 12:32 1951621

Код:

@echo off
setlocal enabledelayedexpansion
set maxfiles=10
set dr="z:\perevalka"
set m=1
set n=0
for /f "delims=" %%a in ('dir "%dr%" /b/a-d') do (
  if "!n!"=="%maxfiles%" (set n=0 &set /a m+=1)
  if not exist "%~dp0name!m!" md "%~dp0name!m!"
  copy "%dr%\%%a" "%~dp0name!m!"
  set /a n+=1
)
pause


sov44 14-07-2012 12:52 1951626

kiripanda, всё равно в папках не по 10 файлов.

kiripanda 14-07-2012 13:11 1951630

у меня по 10

sov44 14-07-2012 13:37 1951636

kiripanda, разобрался, были скрытые файлы :)


Время: 17:41.

Время: 17:41.
© OSzone.net 2001-