Показать полную графическую версию : [решено] Сохранение структуры папок и ее воссоздание с текстовыми файлами вместо файлов
Serezha373737
02-06-2020, 13:10
Есть папка с названием "Структура1" в ней много файлов и подпапок. Файлы и подпапки которые находятся в ней содержат имена из: знаков, русских, английских букв. Есть еще вторая пустая папка с названием "Структура2". Нужно скопировать структуру всех подпапок, которые находятся в папке "Структура1" в папку "Структура2" но без файлов которые в ней находятся, а вместо файлов в ту же папку "Структура2" создать пустые txt-файлы с их именами и плюс с датой когда был создан тот или иной файл.
До батника вид такой:
Структура1: Документ.doc, Фото.jpg ; Подпапка2: Программа.exe, Текст.txt ; Подпапка3: MP3.mp3, MP4.mp4, AVI.avi
Структура2:
После выполнения батника должен вид такой быть:
Структура1: Документ.doc, Фото.jpg ; Подпапка2: Программа.exe, Текст.txt ; Подпапка3: MP3.mp3, MP4.mp4, AVI.avi
Структура2: Документ - 02.04.2020-12.05.34.txt, Фото - 14.03.2020-17.14.45.txt ; Подпапка2: Программа - 21.05.2020-12.05.34.txt, Текст - 02.02.2020-15.05.43.txt ; Подпапка3: MP3 - 02.06.2020-12.05.34.txt, MP4 - 02.06.2020-12.05.34.txt, AVI - 02.06.2020-12.05.34.txt
Все что получилось у меня это создать батник который сохраняет структуру подпапок в текстовый файл, а потом запуском еще вторым батником из ранее сохраненного текста структуры подпапок восстанавливать структуру т.е. таким карявым методом как бы создавать копию структуры подпапок, правда для это мне приходится менять внешний жесткий диск, так как все скопированные пути на восстановление в тестовом файле начинаются с него (папка "Структура1" для примера находится на внешнем жестком диске). И после этого я уже с внешнего жесткого диска копирую структуру подпапок в нужную мне папку, но это уж совсем неудобно. Переписать пути с помощью батника так, чтобы подпапки восстановились в конкретную папку т.е. в папку "Структура2" не знаю как.
На втором шаге, я нашел в интернете: "создание пустых txt-файлов с именами содержимого папки с помощью батника", но батник создает текстовые файлы с именами файлов из одной папки в которой запустился, а в подпапках нет. Тут нужно еще чтобы текстовые файлы создавались не в той папке откуда берутся имена ("Структура1"), а чтобы текстовые файлы создавались в папке "Структура2" после того как туда скопируется структура пустых подпапок.
Я совсем запутался в кодах батника. Помогите пожалуйста! Народ, кто в этом разбирается?! как это можно реализовать в батнике?
DJ Mogarych
02-06-2020, 14:28
Powershell:
$in = "C:\temp\Структура1"
$out = "C:\temp\Структура2"
robocopy "$in" "$out" /e /create
dir "$out" -File -Recurse |% {
Rename-Item "$($_.FullName)" -NewName ($_.BaseName + $_.creationtime.tostring(" - dd.MM.yyyy-HH.mm.ss") + '.txt')
}
Serezha373737
02-06-2020, 14:49
Не совсем то, что нужно. Конечно он структуру подпапок и файлов с их именами он скопировал, но можно как то сделать так чтобы в имени еще была дата и время изменения файла плюс расширение, например чтобы скопированные файлы в своем имени выглядели вот так: Апельсин.jpg - 02.06.2020-14.03.01
DJ Mogarych
02-06-2020, 16:03
Serezha373737, это Powershell, а не CMD, у вас вторая часть скрипта не отрабатывает.
Serezha373737
02-06-2020, 16:14
DJ Mogarych, да у меня видимо действительно вторая часть скрипта не отрабатывает. В Powershell я не очень разбираюсь, если сможете, то помогите пожалуйста исправить.
DJ Mogarych
02-06-2020, 16:25
Надо сохранить этот код в файл с расширением .ps1 и запускать его правой кнопкой мышки - "Выполнить с помощью Powershell".
Serezha373737
02-06-2020, 16:53
Выполнил: Надо сохранить этот код в файл с расширением .ps1 и запускать его правой кнопкой мышки - "Выполнить с помощью Powershell". Теперь совсем ничего не создает..даже подпапки! Которые ранее создавались если я просто копировал код и вставлял в окно Powershell. При запуске открывается на доли секунды окно Powershell: в нем только удалось разглядеть за доли секунды красным цветом "не удалось загрузить файл
При запуске открывается на доли секунды окно Powershell: в нем только удалось разглядеть за доли секунды красным цветом "не удалось загрузить файл »
http://forum.oszone.net/thread-292023.html
megaloman
02-06-2020, 18:53
Serezha373737, Бат-файл. Сохранить в 866 кодировке. Ввозможны пропуски файлов с спецсимволами.@Echo Off
cls
Set "BoxIn=D:\Мой контент"
Set "BoxOut=Z:\Box_Out"
Xcopy "%BoxIn%\*.*" "%BoxOut%\" /T /E
For /F "usebackq delims=" %%f In (`Xcopy "%BoxIn%" "%BoxOut%" /S /Y /F /L`) Do (
Set "Out=%%f"
Call :TxtMake "%%Out: -> =" "%%"
)
pause
Exit /B
:TxtMake
If Not Exist %1 Exit /b 1
Set "Dt=%~t1"
Set "Dt=%Dt: =-%"
Set "Dt=%Dt::=.%"
>"%~2-%Dt%.txt" Cd.
Exit /B 0
artenaki
02-06-2020, 19:20
Сохранить в 866 кодировке »
Это умеет Akelpad.
Serezha373737
02-06-2020, 19:32
Да, именно в Akelpad я и сделал, все как нужно! Всем огромное спасибо за помощь! megaloman, твой код сотворил чудо! СПАСИБО!!! :)
Тему уже я конечно закрыл, так как все работает так как надо, но дабы еще одну похожую тему не создавать у меня еще вопрос. А как можно еще сделать в этом же батнике чтобы были в конце и секунды? :) например так: Фото.jpg-06.10.2016-23.50.29 ?
Апельсин.jpg - 02.06.2020-14.03.01 »
Лучше так:
Апельсин - 2020.06.02-14.03.01.jpg
Serezha373737
02-06-2020, 20:02
можно и так, главное чтобы было! :)
ну так как там добавить секунды еще в конце?)
Serezha373737, Вы про чей код?
megaloman
03-06-2020, 11:24
Serezha373737, Это эстетствующий каприз? За секунды в CMD придётся заплатить долгим временем выполнения. Разве кто из спецов PowerShell заинтересуется. И, опять же, возможны пропуски файлов с необрабатываемыми в CMD символами в именах.@Echo Off
cls
Set "BoxIn=D:\Мой контент"
Set "BoxOut=Z:\Box_Out"
If Not "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn%\"
If Not "%BoxOut:~-1%"=="\" Set "BoxOut=%BoxOut%\"
FOR /F "tokens=1* delims=:" %%i IN ("%BoxIn%") DO Set "Drive=%%i:" &Set "PathLike=%%j" &Call Set "PathLike=%%PathLike:\=\\%%"
>"%Tmp%\%~nx0.tmp" wmic datafile Where "Drive='%Drive%' And Path Like '%PathLike%%%'" get 'Last Modified', Name /Format:CSV
Xcopy "%BoxIn%*.*" "%BoxOut%" /T /E
FOR /F "usebackq tokens=2* delims=," %%i IN (`More "%Tmp%\%~nx0.tmp"`) DO Call :MyFile "%%i" "%%j"
Del "%Tmp%\%~nx0.tmp"
pause
Exit /B
:MyFile
If Not Exist %2 Exit /B 1
Set "FileIn=%~2"
Set "D=%~1"
Set "D=%D:~6,2%.%D:~4,2%.%D:~0,4%_%D:~8,2%.%D:~10,2%.%D:~12,2%.txt
Call Set "FileOut=%%FileIn:%BoxIn%=%BoxOut%%%-%D%"
>"%FileOut%" cd.
Exit /B
Разве кто из спецов PowerShell заинтересуется. »:nunchaku:
Param(
$pathIn = "C:\test\Структура1",
$pathOut = "C:\test\Структура2"
)cls
gci $pathin -rec -file|%{$null>((ni $_.DirectoryName.Replace($pathIn,$pathOut) -I d -F).FullName+'\'+
$_.BaseName+(date $_.LastWriteTime -Format " — dd.MM.yyyy-HH.mm.ss") + $_.Extension )};start $pathOut
Serezha373737
03-06-2020, 15:10
Iska, Вы про чей код?
Iska, почитайте ВНИМАТЕЛЬНЕЕ мои последние сообщения. Первый код был Powershell, а второй код bat. Или вы не знаете что такое "БАТНИК" ?! Слова: " megaloman, твой код сотворил чудо!" "А как можно еще сделать В ЭТОМ ЖЕ БАТНИКЕ чтобы были в конце и секунды?" ...тут речь идет о bat. На данный момент Iska, код bat только один - от megaloman!
...............................................................................
megaloman, Спасибо за код! Теперь уже с секундами! И Да! Есть каприз небольшой :) То, что касается долгим временем выполнения - это не критично! А вот то, что возможны пропуски файлов с не обрабатываемыми в CMD символами в именах, нужно найти вариант это как то исправить...каприз заключается как раз и в этом, что я пытался все реализовать в bat-нике, при этом не используя PowerShell. PowerShell - этот вариант подходит если уж совсем в батнике никак не сделать! DJ Mogarych, Вам тоже спасибо за помощь! :)
PowerShell - этот вариант подходит если уж совсем в батнике никак не сделать! »
В чем логика, если вы получаете желаемый результат без проблем со спец символами?
Serezha373737
03-06-2020, 15:42
Fors1k_m, Желаемый результат я НЕ получил! Ваш код Не работает! При выполнении, показывает черное окно и ничего не происходит! Долгое время ждал когда выполнит, но опять ничего.
..................................
Fors1k_m, логика в том что я делаю программу, которая будет выполняется в загрузочной операционной системе т.е. в оперативной памяти. В загрузочной операционной системе я вырезаю некоторые НЕКРИТИЧНЫЕ программы, службы и утилиты, чтобы освободилось больше оперативной памяти для разных операций, так как вся операционная система находится полностью в оперативной памяти. И поэтому я не вижу смысла только для этого загружать powershell и другие программы, чтобы они там висели в памяти и потребляли ресурсы ОЗУ.
megaloman
03-06-2020, 15:49
Serezha373737, с cmd с символами будут проблемы. Как вариант, можно подумать о vbs или js, если Вас такое устроит.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.