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

Компьютерный форум 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

 

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


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

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


Немного не получилось, скрипт создал папки, с названием расширения, но ничего не копировал в них, лишь создавая пустой файл .log. Мне нужно понять, как сделать так, чтобы скрипт копировал\переносил файлы с подкаталогов и распределял их в отдельную папку с уже готовыми подкаталогами названия которых соответствуют расширению файлов.
Извиняюсь если непонятно обьясняю, просто 2й день уже голову ломаю, не мозг а каша..

Отправлено: 21:18, 26-10-2018 | #11



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

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


Ветеран


Contributor


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

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


ChevConnor, Прикрепите к сообщению свой скрипт, переименованный в txt.
Похоже, у Вас неправильный путь к файлам. Добавьте к коду 2 строки для отладки.
Код: Выделить весь код
@Echo Off
	Set "BoxIn=D:\Мой контент\Книги"
	Set "BoxOut=Z:\Box_Out\Книги"
	Set "Ext=fb2 epub txt pdf txt"

	Dir "%BoxIn%\*.*" /S /B /A:-D
	pause

	For %%e IN (%Ext%) DO (
		Md "%BoxOut%.%%e" 2>nul
		>"%BoxOut%.%%e\^^^^^^.log" (For /F "usebackq delims=" %%i IN (`Xcopy /L /S "%BoxIn%\*.%%e" "%Tmp%\"`) DO (
			If Exist "%%i" (Copy "%%i" "%BoxOut%.%%e\" >nul &Echo %%~ti "%%i")
		))
	)
GoTo :Eof
Список файлов отображается?

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


Последний раз редактировалось megaloman, 26-10-2018 в 22:13.

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

Отправлено: 22:07, 26-10-2018 | #12


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


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

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


Вложения
Тип файла: txt SortFiles.txt
(441 байт, 8 просмотров)

вот, теперь вышло, большое спасибо!

Отправлено: 22:22, 26-10-2018 | #13


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


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

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


А в повершеле такое реально сделать? если можно объясните как, заранее благодарен.

Отправлено: 00:58, 27-10-2018 | #14


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата ChevConnor:
А в повершеле такое реально сделать? »
Вы всё ещё кипятите? Тогда мы идем к вам!
Цитата ChevConnor:
если можно объясните как »
На счет объяснений... это, наверное, в умные книжки придется заглядывать...
А вообще, примерно так:
Код: Выделить весь код
function make-cat {
	process {
		$a = $dst + '\' + $d + $_.extension
		if (!(test-path $a -pathtype container)){
			ni $a -type directory|out-null
			if ($swchlog) {"Создан каталог $a"|out-file $log -enc utf8 -app}
		}
	}
}
function move-file {
	process {
		$i,$fdst=0,$null
		$pthdst = $dst + '\' + $d + $_.extension
		if (test-path ($pthdst + '\' + $_.name)){
			$fdst = $pthdst + '\' + $_.basename
			while (test-path ($fdst + $_.extension)){
				$i = [int] $(if($fdst -match '.*_copy(\d+)'){
					[int]$matches[1]
				} else {0}) + 1
				$fdst = $pthdst + '\' + $($_.basename -replace '_copy\d+') + '_copy' + "$i".padleft(3,"0")
			}
			$pthdst = $fdst + $_.extension
		}
		mi $_.fullname $pthdst
		if ($swchlog) {
			"Перемещён файл $($_.fullname) в каталог $($dst + '\' + $d + $_.extension)"|
			out-file $log -enc utf8 -app
		}
	}
}


$src = 'd:\222' 		# Путь к каталогу для сортировки по расширению
$dst = '.\1' 			# Путь к целевому каталогу
$d = '!sort' 			# Префикс для каталогов по расширению
$log = 'log.txt' 		# Имя для логфайла
$swchlog = $true  		# Вести лог?

$list = dir $src -file -force -rec
$list|select extension -uni|make-cat		# Создаем каталоги
$list|move-file					# Перемещаем файлы
При совпадении имен целевых файлов, будет создаваться новое имя файла по шаблону:
Name_copyXXX.ext
где XXX - номер от 001 до 999

-------
scio me nihil scire. Ѫ

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

Отправлено: 12:52, 27-10-2018 | #15


Ветеран


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

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


ChevConnor, не надо складывать результат работы туда же, откуда забираются файлы в работу:
Код: Выделить весь код
Set "BoxIn=C:\Users\Claymore\Desktop\Files"
Set "BoxOut=C:\Users\Claymore\Desktop\Files\sorted"
Вы пишите одно:
Цитата ChevConnor:
распределить в отдельном каталоге с подкаталогами »
, а подразумеваете/делаете другое. Потому у вас и не получается со скриптами, что испытываете сложности с формулировками.


Цитата ChevConnor:
в повершеле такое реально сделать? если можно объясните как »
что значит: "объясните как"? - прочитайте учебник по powershell
там по порядку расписано какие есть команды, что они делают, как их использовать
когда будет общее представление о языке, тогда можно будет уже обсудить конкретные неочевидные моменты
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:11, 27-10-2018 | #16


Ветеран


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

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


а так не достаточно (по поводу даты изменения чего-то так и не дождался ответа, сделал просто лог с датой операции)?
Код: Выделить весь код
@echo off
set "katalog=C:\papka"
set "out=C:\out"

if not exist "%out%" md "%out%"
pushd "%katalog%"
 for /f "delims=" %%a in ('dir /a-d/b/s') do set "exp=%%~xa"& call :cpr "%%a" "%out%\%%exp:*.=%%" "%out%\log.txt"
popd
pause& exit

:cpr
 if not exist "%~2" md "%~2"
 if not exist "%~2\%~n1%n%%~x1" (
  >nul copy "%~1" "%~2\%~n1%n%%~x1"
  >>"%~3" (cmd /v/c echo !date!_!time:~0,8!& echo copy "%~1" "%~2\%~n1%n%%~x1")
 ) else (
  set /a n+=1& goto cpr
 )
exit /b

Последний раз редактировалось alpap, 27-10-2018 в 17:47.

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

Отправлено: 17:34, 27-10-2018 | #17


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


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

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


Только с работы пришел, да лог с изменениями и датой подошел, спасибо огромное ребят, очень помогли

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


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


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

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


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

Последний раз редактировалось Amunrah, 28-10-2018 в 12:52.


Отправлено: 10:07, 28-10-2018 | #19


Ветеран


Contributor


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

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


ChevConnor,
Код: Выделить весь код
@Echo Off
	Set "BoxIn=D:\Мой контент\Книги"
	Set "BoxOut=Z:\Box_Out\Книги"
rem	Set "BoxOut=D:\Мой контент\Книги"
	
	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 "%BoxIn%\*.*" /B /S /A:-D`) DO (
		If /I Not "%BoxOut%%%~xi\"=="%%~dpi" ( 
			If Not Exist "%BoxOut%%%~xi\*%%~xi" Md "%BoxOut%%%~xi"
			>>"%BoxOut%%%~xi\^^^^^^_%Now%.Log" Echo %%~ti "%%i"
			Copy "%%i" "%BoxOut%%%~xi\" >nul
		)
	)
GoTo :Eof
Вот вариант: Файлы рассортировываются по каталогам с именами по расширению. Имена входного и выходного каталогов могут совпадать (так как к имени выходного каталога по любому добавится расширение файлов). В каждом каталоге по имени расширения добавляется лог-файл с именем ^^^^^_ГГГГММДДччммсс.log, где ГГГГММДДччммсс-время старта батника. Начало имени ^^^^^ -сделано для того, чтобы по алфавиту название было вверху.
В лог файле прописаны время изменения копируемого файла и его имя

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


Отправлено: 12:07, 28-10-2018 | #20



Компьютерный форум 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




 
Переход