Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Разложить файлы из кучи по каталогам согласно образцу

Ответить
Настройки темы
CMD/BAT - Разложить файлы из кучи по каталогам согласно образцу

Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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
Важное замечание: В каталоге Страны_Разобрать не могуть быть файлы, отсутствующие в каталоге страны_образец.

Отправлено: 00:26, 11-03-2011

 

Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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.
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:26, 11-03-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 11:15, 11-03-2011 | #3


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 11:57, 11-03-2011 | #4


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png 11.03.png
(12.0 Kb, 10 просмотров)

Слэши смотрят в правильную сторону, я скопипастил Ваш код, поменяв только логический диск в адресе.

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

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

Отправлено: 14:17, 11-03-2011 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:36, 11-03-2011 | #6


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png 2 - 11.03 notepad.png
(23.4 Kb, 8 просмотров)
Тип файла: png 2 - 11.03 tc.png
(25.6 Kb, 8 просмотров)
Тип файла: png 2 - 11.03 cmd.png
(16.1 Kb, 6 просмотров)

Цитата Iska:
пакетные файлы надо сохранять в кодировке 866 любым поддерживающим это редактором. »
Сделал -- помогло, спасибо.
Скрипт отрабатывает, файлы, судя по всему находит, но не перемещает.
Как выловить проблему?

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

Отправлено: 14:57, 11-03-2011 | #7


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


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

Отправлено: 03:07, 12-03-2011 | #8


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Не хотелось усложнять скрипт, но придется. Теперь Вам не надо ничего править, кроме (если нужно) путей, по которым находятся Ваши папки.
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:45, 12-03-2011 | #9


Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 11:32, 12-03-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Разложить файлы из кучи по каталогам согласно образцу

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] переместить файлы по папкам согласно списку shadowbat Скриптовые языки администрирования Windows 9 17-11-2023 14:51
[решено] Поиск и запуск приложения согласно условию If... semiono AutoIt 19 18-02-2010 00:24
Прочее - Нужна помощь в настройке VMware согласно схеме. axsi Сетевые технологии 4 27-03-2009 15:05
Рейтинг обращений к каталогам ValVlaGen Программное обеспечение Windows 0 24-04-2008 08:41
Удаление пользователя из группы в АД согласно расписанию Local.admin Microsoft Windows NT/2000/2003 5 09-11-2007 12:48




 
Переход