Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сохранение структуры папок и ее воссоздание с текстовыми файлами вместо файлов (http://forum.oszone.net/showthread.php?t=345409)

Serezha373737 02-06-2020 13:10 2923692

[решено] Сохранение структуры папок и ее воссоздание с текстовыми файлами вместо файлов
 
Есть папка с названием "Структура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 2923704

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 2923705

Не совсем то, что нужно. Конечно он структуру подпапок и файлов с их именами он скопировал, но можно как то сделать так чтобы в имени еще была дата и время изменения файла плюс расширение, например чтобы скопированные файлы в своем имени выглядели вот так: Апельсин.jpg - 02.06.2020-14.03.01

DJ Mogarych 02-06-2020 16:03 2923715

Serezha373737, это Powershell, а не CMD, у вас вторая часть скрипта не отрабатывает.

Serezha373737 02-06-2020 16:14 2923719

DJ Mogarych, да у меня видимо действительно вторая часть скрипта не отрабатывает. В Powershell я не очень разбираюсь, если сможете, то помогите пожалуйста исправить.

DJ Mogarych 02-06-2020 16:25 2923722

Надо сохранить этот код в файл с расширением .ps1 и запускать его правой кнопкой мышки - "Выполнить с помощью Powershell".

Serezha373737 02-06-2020 16:53 2923725

Выполнил: Надо сохранить этот код в файл с расширением .ps1 и запускать его правой кнопкой мышки - "Выполнить с помощью Powershell". Теперь совсем ничего не создает..даже подпапки! Которые ранее создавались если я просто копировал код и вставлял в окно Powershell. При запуске открывается на доли секунды окно Powershell: в нем только удалось разглядеть за доли секунды красным цветом "не удалось загрузить файл

YuS_2 02-06-2020 18:46 2923735

Цитата:

Цитата Serezha373737
При запуске открывается на доли секунды окно Powershell: в нем только удалось разглядеть за доли секунды красным цветом "не удалось загрузить файл »

http://forum.oszone.net/thread-292023.html

megaloman 02-06-2020 18:53 2923738

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 2923747

Цитата:

Цитата megaloman
Сохранить в 866 кодировке »

Это умеет Akelpad.

Serezha373737 02-06-2020 19:32 2923750

Да, именно в Akelpad я и сделал, все как нужно! Всем огромное спасибо за помощь! megaloman, твой код сотворил чудо! СПАСИБО!!! :)

Тему уже я конечно закрыл, так как все работает так как надо, но дабы еще одну похожую тему не создавать у меня еще вопрос. А как можно еще сделать в этом же батнике чтобы были в конце и секунды? :) например так: Фото.jpg-06.10.2016-23.50.29 ?

Iska 02-06-2020 19:52 2923760

Цитата:

Цитата Serezha373737
Апельсин.jpg - 02.06.2020-14.03.01 »

Лучше так:
Код:

Апельсин - 2020.06.02-14.03.01.jpg

Serezha373737 02-06-2020 20:02 2923765

можно и так, главное чтобы было! :)

ну так как там добавить секунды еще в конце?)

Iska 03-06-2020 00:11 2923810

Serezha373737, Вы про чей код?

megaloman 03-06-2020 11:24 2923832

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


Fors1k 03-06-2020 15:01 2923847

Цитата:

Цитата megaloman
Разве кто из спецов 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 2923848

Iska, Вы про чей код?

Iska, почитайте ВНИМАТЕЛЬНЕЕ мои последние сообщения. Первый код был Powershell, а второй код bat. Или вы не знаете что такое "БАТНИК" ?! Слова: " megaloman, твой код сотворил чудо!" "А как можно еще сделать В ЭТОМ ЖЕ БАТНИКЕ чтобы были в конце и секунды?" ...тут речь идет о bat. На данный момент Iska, код bat только один - от megaloman!
...............................................................................

megaloman, Спасибо за код! Теперь уже с секундами! И Да! Есть каприз небольшой :) То, что касается долгим временем выполнения - это не критично! А вот то, что возможны пропуски файлов с не обрабатываемыми в CMD символами в именах, нужно найти вариант это как то исправить...каприз заключается как раз и в этом, что я пытался все реализовать в bat-нике, при этом не используя PowerShell. PowerShell - этот вариант подходит если уж совсем в батнике никак не сделать! DJ Mogarych, Вам тоже спасибо за помощь! :)

Fors1k 03-06-2020 15:17 2923849

Цитата:

Цитата Serezha373737
PowerShell - этот вариант подходит если уж совсем в батнике никак не сделать! »

В чем логика, если вы получаете желаемый результат без проблем со спец символами?

Serezha373737 03-06-2020 15:42 2923851

Fors1k_m, Желаемый результат я НЕ получил! Ваш код Не работает! При выполнении, показывает черное окно и ничего не происходит! Долгое время ждал когда выполнит, но опять ничего.
..................................

Fors1k_m, логика в том что я делаю программу, которая будет выполняется в загрузочной операционной системе т.е. в оперативной памяти. В загрузочной операционной системе я вырезаю некоторые НЕКРИТИЧНЫЕ программы, службы и утилиты, чтобы освободилось больше оперативной памяти для разных операций, так как вся операционная система находится полностью в оперативной памяти. И поэтому я не вижу смысла только для этого загружать powershell и другие программы, чтобы они там висели в памяти и потребляли ресурсы ОЗУ.

megaloman 03-06-2020 15:49 2923853

Serezha373737, с cmd с символами будут проблемы. Как вариант, можно подумать о vbs или js, если Вас такое устроит.

Serezha373737 03-06-2020 15:57 2923854

Да vbs тоже подходит! Если сможете сделать и на vbs буду очень рад :) может в vbs пропусков спец символов не будет

artenaki 03-06-2020 17:53 2923859

Цитата:

Цитата megaloman
возможны пропуски файлов с необрабатываемыми в CMD символами в именах »

Это, я так понимаю, из других языков, кроме русского и английского (кодировки OEM 866). Например, французская немецкая диакритика, азиатские символы.

Iska 03-06-2020 18:14 2923863

Цитата:

Цитата Serezha373737
Или вы не знаете что такое "БАТНИК" ?! »

Я-то знаю. А вот Вы обзываете пакетный файл каким-то свитером :lol:.

Цитата:

Цитата Serezha373737
я делаю программу, которая будет выполняется в загрузочной операционной системе т.е. в оперативной памяти. В загрузочной операционной системе я вырезаю некоторые НЕКРИТИЧНЫЕ программы, службы и утилиты, чтобы освободилось больше оперативной памяти для разных операций, так как вся операционная система находится полностью в оперативной памяти. »

А… Ну, так бы сразу и сказали.

:shot:

Serezha373737 03-06-2020 19:48 2923871

Цитата:

Цитата Iska
Я-то знаю. А вот Вы обзываете пакетный файл каким-то свитером . »

Iska, это не свитер. Это профессиональный жаргон, который используется программистами. Такое понятие как профессиональный жаргон Вам явно не знакомо, учите русский язык сначала! И не надо высказывать: "А вот Вы", не нужно тут пытаться цепляться к каждому слову. Если Вы жить без этого не можете, то для этого предназначены другие форумы и соц.сети. Не нужно захламлять форум глупыми вопросами и высказываниями Iska, если у Вас есть что то предложить в коде, то предлагайте. За все время Вы так и не предложили ничего полезного!

Iska 03-06-2020 19:59 2923872

artenaki, любая пунктуация, которая не входит в OEM/866.

Serezha373737, это безграмотность, а вовсе не «профессиональный жаргон», литератор Вы наш.

Serezha373737 03-06-2020 20:23 2923876

Цитата:

Цитата Iska
это безграмотность, а вовсе не «профессиональный жаргон», литератор Вы наш. »

Iska, опять Вы захламляете форум своими глупыми высказываниями! Пишите так, как будто Вы школьник начальных классов! Вы бы для начала, хотя бы посмотрели что такое «профессиональный жаргон» и не писали бы тут всякую ересь.

megaloman 03-06-2020 20:34 2923879

VBS сохранить 1251
Код:

BoxIn = "D:\Мой контент"
BoxOut = "Z:\Box_Out"

Set FSO = CreateObject("Scripting.FileSystemObject")

If Right(BoxIn, 1) <> "\" Then BoxIn = BoxIn + "\"
If Right(BoxOut, 1) <> "\" Then BoxOut = BoxOut + "\"

Call Directory(FSO, BoxIn, "", BoxOut)

MsgBox "Сделано!"
'---------------------End Sub

Sub Directory(FSO, DName, DIn, DOut)
    Set D = FSO.GetFolder(DName)
    Dold = D.Path + "\"
    If DIn = "" Then DIn = Dold
    DNew = Replace(Dold, DIn, DOut)
    If Not FSO.FolderExists(DNew) Then FSO.CreateFolder (DNew)
   
    Set Files = D.Files
    For Each iFile In Files
        Dt = CStr(iFile.DateLastModified)
        Dt = Replace(Dt, " ", "_")
        Dt = "-" + Replace(Dt, ":", ".") + ".txt"
        Set FF = FSO.CreateTextFile(Dnew + iFile.Name + Dt, True): FF.Close
    Next
   
    Set SubD = D.SubFolders
    For Each Direct In SubD
        Call Directory(FSO, Direct, DIn, DOut)
    Next
End Sub


Fors1k 03-06-2020 20:56 2923881

Цитата:

Цитата Serezha373737
За все время Вы так и не предложили ничего полезного! »

Будто толк есть что-то предлагать вам, если вы все равно не можете просто запустить готовое решение=)

Serezha373737 03-06-2020 21:19 2923885

megaloman, СПАСИБО!!! Вы просто волшебник, настоящий профессионал!!! :) Решили мою проблему сразу bat и vbs файлом!
.......................................................................
Цитата:

Цитата Fors1k_m
Будто толк есть что-то предлагать вам, если вы все равно не можете просто запустить готовое решение »

Fors1k_m, все запускается и работает, если код делает настоящий мастер!!! Fors1k_m если у Вас нет необходимых знаний чтобы сделать код, не стоит винить в этом других, что у других что то не запускается. А толк как видите есть, чем же объясните что коды и решение которое предлагает megaloman - запускается и отлично все работает

Кто мне помогал ОГРОМНОЕ СПАСИБО! Тему можно закрыть :) Все что было нужно - отлично работает!!!

megaloman 03-06-2020 21:31 2923887

Serezha373737, Без перебранок, пожалуйста! Полезнее спокойно разобраться, в чем дело.
ИМХО, каждый, кто предлагает код, его тестирует и уверен в его работоспособности. PowerShell, возможно, у Вас более старой версии. Ради интереса:
В командном окне запустите
PowerShell
Выполните команду
Host
Посмотрите версию.

Serezha373737 03-06-2020 21:42 2923891

megaloman, разница в версии PowerShell - это не причина того, что что я что-то не умею запускать. Если код работает в определенной версии PowerShell автор по идеи должен указать на какой версии PowerShell код работает, как Вы например указываете кодировку и т.д. Я сам по образованию программист. У меня стоит PowerShell версия 2.0

Или хотя бы спросить какая у меня версия PowerShell, а потом только создавать код. С точки зрения программиста вещи очевидные! :)

megaloman 03-06-2020 21:53 2923894

Serezha373737, Тут недавно была аналогичная проблема. Я случайно об нее споткнулся. Обновитесь хотя бы до 5.1

Serezha373737 03-06-2020 22:00 2923897

megaloman, Да, но опять же, если кто то создает код в PowerShell, то спросить у пользователя какая у него версия PowerShell перед созданием кода не судьба?! :)

megaloman 03-06-2020 22:06 2923898

Serezha373737, А что, всё можно предусмотреть? В Win 10 эта версия вроде бы ставится стандартно вместе с обновлениями. Просто логично предполагать, что если вы юзаете PowerShell, то Вы позаботились о его актуальности.

Serezha373737 03-06-2020 22:50 2923904

megaloman, не нужно никогда надеется на то что у пользователя, программы будут актуальной версии!!! В том числе и на то, что пользователь пользуется Windows 10!!! Хотя слово "актуальной" тут не совсем уместно, правильнее лучше назвать "старой версии", потому что старые версии тоже рабочие. Операционные системы тоже есть разные у всех. Пример: с чего вдруг заказчик такси ЛОГИЧНО ПРЕДПОЛОЖИТ что к нему приедет жигули??? Ведь автомобилей много бывает разных всяких марок и моделей?! Для этого оператор и уточняет у заказчика при звонке "от куда" и "куда нужно приехать" т.е. задает уточняющие вопросы чтобы построить маршрут! Тоже же самое и с любыми программами, утилитами и т.д. Тот кто создает код, тоже нужно уточнить для каких программ, операционных систем и т.д. нужно создать код, если для работоспособности кода это важно. И тогда создатель кода уже сможет построить маршрут, чего и что создавать. Я согласен с тем, что все предусмотреть нельзя! Но, не уточнив куда и от куда ехать, как можно надеется и логично предполагать что приедут?! :) megaloman

artenaki 03-06-2020 23:22 2923907

Зачастую составитель скрипта может поручиться только за версию, установленную у него. Разве что у него есть виртуалки с новыми или старыми версиями.

Serezha373737 04-06-2020 00:38 2923914

artenaki, не о том речь идет, что может или не может поручиться...за свою версию или не за свою, а речь идет о том что составителю скрипта необходимо уточнять версию программы у пользователя на котором собирается работать скрипт составителя. Для чего же тогда создатели программ на своих сайтах программ указывают для загрузки информацию о том на каких операционных систем программа будет работать: Windows 7, 8, 10; 64 битная или нет, минимум NET Framework 4 или выше....неужели все создатели указывают эту информацию для пользователей просто так?! А указывают именно потому, что понимают что у каждого пользователя может быть установлена разная операционная система, могут быть у каждого пользователя установлены разные NET Framework..например допустим NET Framework 3.5 - не просто так это пишут, а для того чтобы сразу пользователю уточнить на каких условиях программа будет работать, в данном случае из приведенного примера: только NET Framework 4 и выше, что является критичным при выполнении программы. Соответственно, так как составитель скрипта не знает на чем будет выполняться скрипт, то необходимо у пользователя уточнить условия где будет выполняться скрипт. artenaki, отсюда делаем вывод: что если зачастую составитель скрипта может поручиться только за свою версию, установленную у него, то это не означает что на других скрипт будет работать!

DJ Mogarych 04-06-2020 09:30 2923931

Цитата:

Цитата Serezha373737
составителю скрипта необходимо уточнять версию программы у пользователя »

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

YuS_2 04-06-2020 09:30 2923932

Цитата:

Цитата Serezha373737
а речь идет о том что составителю скрипта необходимо уточнять версию программы у пользователя на котором собирается работать скрипт составителя. »

Вот читаю топик и думаю: А не слишком ли много у Вас пожеланий? Кто тут Вам и что задолжал? Философ блин. Не надо путать коммерческие отношения и безвозмездную помощь в чем-либо...
Если Вы пришли за помощью, то и озаботиться о предоставлении наиболее полной информации о том, какие программные средства у Вас в наличии, необходимо именно Вам, а не тем, кто будет эту помощь осуществлять. Это первое.
Второе: насколько оправданно, размещение вопроса на нескольких форумах одновременно, причем с учеток, зарегистрированных перед публикацией вопроса... при этом, публикуя код с одного форума на другом, слегка его "поправив", представлять его как собственный? Кто Вы после этого?
Цитата:

Что в батнике я ни так делаю?
ссылка на цитату.
Третье: если берётесь кого-либо обвинять в незнании русского языка, то не совершайте грамматических и синтаксических ошибок, в том самом, русском языке, иначе ваши обвинения выглядят очень смешно...


Был тут один персонаж, очень напоминаете его по стилю ... на месте помогающих, я бы прекратил вообще какую-либо помощь Вам.


Время: 08:14.

Время: 08:14.
© OSzone.net 2001-