|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сортировка файлов в каталоге с подкаталогами |
|
CMD/BAT - Сортировка файлов в каталоге с подкаталогами
|
Новый участник Сообщения: 11 |
Профиль | Отправить PM | Цитировать
Прошу помощи! У меня есть каталог ( папка ) с подкаталогами ( папками ). В каталоге есть файлы скажем .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
|
Профиль | Отправить PM | Цитировать Немного не получилось, скрипт создал папки, с названием расширения, но ничего не копировал в них, лишь создавая пустой файл .log. Мне нужно понять, как сделать так, чтобы скрипт копировал\переносил файлы с подкаталогов и распределял их в отдельную папку с уже готовыми подкаталогами названия которых соответствуют расширению файлов.
Извиняюсь если непонятно обьясняю, просто 2й день уже голову ломаю, не мозг а каша.. |
Отправлено: 21:18, 26-10-2018 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2708
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать вот, теперь вышло, большое спасибо!
|
Отправлено: 22:22, 26-10-2018 | #13 |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать А в повершеле такое реально сделать? если можно объясните как, заранее благодарен.
|
Отправлено: 00:58, 27-10-2018 | #14 |
Crazy Сообщения: 1171
|
Профиль | Отправить 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 |
||
------- Отправлено: 12:52, 27-10-2018 | #15 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать ChevConnor, не надо складывать результат работы туда же, откуда забираются файлы в работу:
Set "BoxIn=C:\Users\Claymore\Desktop\Files" Set "BoxOut=C:\Users\Claymore\Desktop\Files\sorted" Цитата ChevConnor:
Цитата ChevConnor:
там по порядку расписано какие есть команды, что они делают, как их использовать когда будет общее представление о языке, тогда можно будет уже обсудить конкретные неочевидные моменты |
||
Отправлено: 14:11, 27-10-2018 | #16 |
Ветеран Сообщения: 1274
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать Только с работы пришел, да лог с изменениями и датой подошел, спасибо огромное ребят, очень помогли
|
Отправлено: 20:57, 27-10-2018 | #18 |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать alpap Если счетчик не сбрасывать, то он у вас будет нумеровать вообще все файлы, стоит ему только раз получить значение...
|
Последний раз редактировалось Amunrah, 28-10-2018 в 12:52. Отправлено: 10:07, 28-10-2018 | #19 |
Ветеран Сообщения: 2708
|
Профиль | Отправить 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
В лог файле прописаны время изменения копируемого файла и его имя |
------- Отправлено: 12:07, 28-10-2018 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|