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

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

Ответить
Настройки темы
CMD/BAT - Сортировка файлов в каталоге с подкаталогами

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


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

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


Изменения
Автор: ChevConnor
Дата: 26-10-2018
Прошу помощи! У меня есть каталог ( папка ) с подкаталогами ( папками ). В каталоге есть файлы скажем .txt .doc .pdf
Мне нужно отсортировать их по расширению и распределить в отдельном каталоге с подкаталогами названия которых соответствуют расширению. Cортировку выполнить копированием. При этом чтобы после сортировки в файле .txt указывалась дата\время последних изменений
В том что я написал происходит следующее - файлы сортируются только из основного каталога, а из подкаталогов не затрагиваются, и каждый раз перезаписывает файл с временем\датой последних изменений.

@echo off
setlocal enabledelayedexpansion
xcopy *.txt sort\txt
DIR > sort\txt.txt
xcopy *.doc sort\doc
DIR > sort\doc.txt
pause

Отправлено: 19:37, 26-10-2018

 

Ветеран


Contributor


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

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


Amunrah,
Вот вариант для многократного запуска. Повторное копирование файлов за одну дату/время не происходит
Код: Выделить весь код
@Echo Off
	Set "BoxIn=Z:\Box_In\Мой контент\Книги"
	Set "BoxOut=Z:\Box_Out\Книги"

	Set "Mask=*.*"
rem	Set "Mask=*.pdf *.fb2 *. *.epub"
	
	Pushd "%BoxIn%" ||(Echo Input folder not found "%BoxIn%" &Pause &Exit /B 2)

	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Now=%%d"
	Set Now=%Now:~0,14%

	For /F "usebackq delims=" %%i IN (`2^>nul Dir %Mask% /B /S /A:-D /O:D`) DO (Set "Text=%%~xi." &Call :MySort "%%i" "%BoxOut%\%%Text:~1%%\%%~nxi" %Now%)
	Popd
GoTo :Eof

:MySort 
	If Exist %2 If /I "%~t1"=="%~t2" Exit /B 1
	If Not Exist "%~dp2" Md "%~dp2"
	>>"%~dp2\^^_%3.Log" Echo %~t1 %1
	>>"%BoxOut%\^^^_All_%3.Log" Echo %~t1 %1
	Copy %1 %2 >nul
GoTo :Eof
Лог-файлы создаются для каждого расширения в каждой папке.
При многократном запуске наверное важен обзорный лог - сделал
Можно задавать список масок: выбирай хоть избранные файлы, хоть все
Ваш вариант, похоже, сомнительный, по функционалу не универсальный из-за ключа /D 0 в forfiles. Я не очень привык к forfiles, возможно ошибаюсь, но это приводит к обработке файлов только за сегодня. Поэтому возможно и была ошибка у меня - в инбоксе были только старые файлы и ничего для копирования найдено не было.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 14:50, 29-10-2018 | #31



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

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


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


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

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


megaloman,
Цитата megaloman:
Ваш вариант, похоже, сомнительный, по функционалу не универсальный из-за ключа /D 0 в forfiles. Я не очень привык к forfiles, возможно ошибаюсь, но это приводит к обработке файлов только за сегодня. Поэтому возможно и была ошибка у меня - в инбоксе были только старые файлы и ничего для копирования найдено не было. »
Как уже говорил, я не сторонник додумывать за окружающих и писать многофункциональный комбайн к банальному вопросу. Всех моментов все-равно не учесть, но, главное, это и незачем. Как гласит одна из прописных истин дзэн-питона - Простое лучше чем сложное. Переубеждать не стану конечно.
Мой вариант решает именно то, что озвучил топикстартер, не более. В forfiles к ошибке обычно приводит ключ /c (на некоторых виндах) поэтому вместо него рекомендуют использовать . В остальном все замечательно и утилита прекрасно справляется. Поэтому останусь при своем.

А ключ /D можно использовать (или не использовать) как в forfiles, так и в xcopy:
/D:m-d-y - Копирование файлов, измененных не ранее указанной даты. Если дата не указана, заменяются только конечные файлы, более старые, чем исходные.


Скрытый текст
Код: Выделить весь код
set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

echo."Время начала запуска - %date% %time:~0,8%">>%dest%\log.txt

forfiles /p "%src%" /m * /s -c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt


Цитата:
ИМХО, это правильная идея, (каюсь, поленился сделать).
Рад что моя идея вам понравилась, но надо-ли оно кому-то пока вопрос... и шкалу прогресса прикрутить не забудьте, а то не комильфо

Последний раз редактировалось Amunrah, 30-10-2018 в 18:05.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:43, 29-10-2018 | #32


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


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

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


Спасибо большое ребят. Очень помогли.

Отправлено: 18:20, 31-10-2018 | #33


Ветеран


Contributor


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

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


Цитата ChevConnor:
Мне нужно чтобы файл работал в текущем каталоге, а он работает только по указанному пути в BoxIn BoxOut. ... чтобы запускаемый батник работал в текущем каталоге без указания пути?
Set "BoxIn=C:\Users\Claymore\Desktop\Files"
Set "BoxOut=C:\Users\Claymore\Desktop\Files\sorted\"
Не очень помню задачу, замените эти строки на
Код: Выделить весь код
FOR /F "usebackq delims=" %%s IN (`CD`) DO Set "BoxIn=%%s"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
Set "BoxOut=%BoxIn%\sorted"

Echo BoxIn =%BoxIn%
Echo BoxOut=%BoxOut%
Echo, естественно, можно убить

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 14:38, 12-11-2018 | #34



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] получение списка имён файлов без имен папок (с подкаталогами) shadowbat Скриптовые языки администрирования Windows 6 20-12-2015 19:29
Любой язык - [решено] Архивирование файлов в каталоге Tonny_Bennet Скриптовые языки администрирования Windows 53 11-01-2015 13:11
CMD/BAT - Переименование файлов в каталоге flower Скриптовые языки администрирования Windows 2 28-11-2013 15:00
VBS/WSH/JS - Мониторинг файлов в каталоге ugol_divana Скриптовые языки администрирования Windows 1 03-08-2013 17:15
Любой язык - [решено] Распределение файлов в каталоге Тишина Скриптовые языки администрирования Windows 2 26-04-2013 17:09




 
Переход