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

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

Ответить
Настройки темы
CMD/BAT - [решено] Необходимо реализовать задачу с расчётом хеша в директориях и сохранением в фаил.

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


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


Конфигурация

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


Мне это необходимо для автоматизированного бекапа через программу GoodSync, там можно выполнять команды до синхронизации(бекапа).
Так вот я хочу чтобы перед синхронизацией создавался по всем правилам созданный фаил с контрольной суммой всех файлов в директории и поддиректориях, исключая при этом файлы Thumbs.db (и не только, зависит от конкретной бекап-задачи). Причём чтобы была возможность сохранять этот фаил со списком контрольных сумм файлов в произвольном месте а не сканируемой директории.

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

Отправлено: 09:25, 17-12-2013

 

Ветеран


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

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


echo Generated on `date` > /var/log/md5.hashes; find $DIR_TO_BACKUP -type f \! -name Thumbs.db -exec md5sum {} \; >> /var/log/md5.hashes
Правда это не для Windows...

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.


Отправлено: 03:04, 18-12-2013 | #11



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

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


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


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

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


Цитата Iska:
Вы ранее ничего не упоминали про кодировку »
Цитата Iska:
И по этому поводу ранее ничего не было сказано »
Всё тестируется по факту, заведомо не мог знать как обработает черкер выходной фаил :-)

Я радовался, радовался. А потом понял что скрипт и так не обрабатывает Thumbs.db, и не потому что в списках исключения а потому что имеет скрытый атрибут (и возможно системный?) . И соответственно другие файлы с атрибутом "скрытый" тоже :-(

Это можно как-нибуть излечить?

И ещё если это возможно очень бы хотелось чтобы в комментарии прописывалось общее число просканированных файлов. Что то вроде такого.
; Generated on 03/03/2013 02:37:09
; Scanned files: 3563

А если уж совсем идеально, то можно добавить к просканированным файлам ещё и общее количество (с учётом исключений). Например вот так.
; Generated on 03/03/2013 02:37:09
; Scanned files: 3563
; Total files: 3572

--- UPD ---
И обмозговав свои будущие проекты я понял что мне необходимо исключать не только файлы но и папки.
Быть может стоит вынести в переменную в начало файла-скрипта некий список?
Я не знаю как это сделать, но примерно я представляю это так.
%files%
Thumbs.db
Descript.ion

%folders%
D:\Workfolder\Caсhe\ (или с относительными путями к сканируемой корневой папке)
D:\TestSun\Profile\Temp\
и так далее каждый новый объект с новой строчки.

Соответственно наверное если реализовать это то предложение с подсчётом исключённых файлов и самое главное папок уже будет не столь состоятельным. Ну если эта фича сложна в реализации то без неё проживу :-)
Главное это подсчёт всех файлов (включая скрытые и системные) и введение исключений и на папки.

Последний раз редактировалось DjBoBo, 18-12-2013 в 16:34.


Отправлено: 12:36, 18-12-2013 | #12


Ветеран


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

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


{
echo "; Generated on `date`"
echo "; Scanned files: `find $DIR_TO_BACKUP -type f \! -name Thumbs.db | wc -l`"
echo "; Total files: `find $DIR_TO_BACKUP -type f | wc -l`"
find $DIR_TO_BACKUP -type f \! -name Thumbs.db -exec md5sum {} \;
} > /var/log/md5.hashes

Опять-таки не для Windows

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.


Последний раз редактировалось AMDBulldozer, 18-12-2013 в 13:36.


Отправлено: 13:26, 18-12-2013 | #13


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


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

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


AMDBulldozer, спасибо конечно. Но я использую исключительно Windows :-) Хотелось бы закончить этот "проект века" наконец и забекапить по всем правилам и своим внутренним критериям все свои многочисленные файлы :-)

Отправлено: 14:53, 18-12-2013 | #14


Ветеран


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

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


Цитата DjBoBo:
Я радовался, радовался. А потом понял что скрипт и так не обрабатывает Thumbs.db, и не потому что в списках исключения а потому что имеет скрытый атрибут (и возможно системный?) . И соответственно другие файлы с атрибутом "скрытый" тоже :-( Это можно как-нибуть излечить?»
Выходит, что так:
Цитата:
-Force

Allows the cmdlet to get items that cannot otherwise not be accessed by the user, such as hidden or system files.
Я тоже учусь.

Цитата DjBoBo:
И ещё если это возможно очень бы хотелось чтобы в комментарии прописывалось общее число просканированных файлов. Что то вроде такого.
; Generated on 03/03/2013 02:37:09
; Scanned files: 3563
А если уж совсем идеально, то можно добавить к просканированным файлам ещё и общее количество (с учётом исключений). Например вот так.
; Generated on 03/03/2013 02:37:09
; Scanned files: 3563
; Total files: 3572 »
Я посмотрю, что можно сделать. Но логику всю придётся переделывать.

Цитата DjBoBo:
И обмозговав свои будущие проекты я понял что мне необходимо исключать не только файлы но и папки.
Быть может стоит вынести в переменную в начало файла-скрипта некий список?
Я не знаю как это сделать, но примерно я представляю это так.
%files%
Thumbs.db
Descript.ion
%folders%
D:\Workfolder\Caсhe\ (или с относительными путями к сканируемой корневой папке)
D:\TestSun\Profile\Temp\
и так далее каждый новый объект с новой строчки.
Соответственно наверное если реализовать это то предложение с подсчётом исключённых файлов и самое главное папок уже будет не столь состоятельным. Ну если эта фича сложна в реализации то без неё проживу :-)
Главное это подсчёт всех файлов (включая скрытые и системные) и введение исключений и на папки. »
Без подсчёта исключённых будет много проще. Поясните про относительные пути, ибо логика разная.

Отправлено: 00:40, 19-12-2013 | #15


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


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

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


Iska, Огромное спасибо что помогаете мне в реализации, ваша помощь бесценна :-)
Подсчёт исключённых действительно был бы избыточен, желательно просто реализовать подсчёт общего количества просканированных файлов и соответственно хеш-записей. И не более.
Касаемо же путей, я просто подумал если в скрипте указывается жёстко рабочая папка, то наверное при написании папок-исключений необходимо отталкиваться относительно её, а это значит пути будут относительными. Хотя конечно окончательный выбор за вами. В моём случае сканируемые папки на компьютере не перемещаются.
Но в тоже время относительно вывода (хеш-файла) ничего не меняется, там так и должны быть относительные пути.

Отправлено: 02:13, 19-12-2013 | #16


Ветеран


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

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


Пробуйте:
читать дальше »
Код: Выделить весь код
function GetMD5Hash([System.String]$sFile) {
    $oHashAlgorithm = [Security.Cryptography.HashAlgorithm]::Create("MD5")

    $oStreamReader = ([System.IO.StreamReader]$sFile).BaseStream
    
    -join ($oHashAlgorithm.ComputeHash($oStreamReader) | ForEach-Object -Process { "{0:x2}" -f $_ })
    $oStreamReader.Close()
}

$sRootPath       = "E:\Песочница\0328"
$sMD5ListPath    = "E:\Песочница\0336\MD5 List.txt"
$sExcludeFiles   = "E:\Песочница\0336\ExcludeFiles.txt"
$sExcludeFolders = "E:\Песочница\0336\ExcludeFolders.txt"


$cExcludeFiles   = @(Get-Content -Path $sExcludeFiles   -Encoding UTF8)
$cExcludeFolders = @(Get-Content -Path $sExcludeFolders -Encoding UTF8)


$cList = Get-ChildItem -Path $sRootPath -Recurse -Force |`
    Where-Object -FilterScript { -not $_.PSIsContainer -and $cExcludeFiles -notcontains $_.Name }
    
foreach($elem in $cExcludeFolders) {
    $cList = $cList | Where-Object -FilterScript { -not $_.FullName.StartsWith("$sRootPath\$elem") }
}

"; Generated on $(Get-Date)", "; Total files: $($cList.Length)", ( $cList | ForEach-Object -Process {
    "$(GetMD5Hash $_.FullName) $($_.FullName.Substring($sRootPath.Length + 1))"
} ) | Out-File -FilePath $sMD5ListPath -Encoding UTF8

Цитата DjBoBo:
Касаемо же путей, я просто подумал если в скрипте указывается жёстко рабочая папка, то наверное при написании папок-исключений необходимо отталкиваться относительно её, а это значит пути будут относительными. »
Да. И без замыкающего обратного слэша (т.е. «Exclude Folder 01», «Exclude Folder 02», «Exclude Folder 03\Folder4\Folder5» и т.п.).
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:02, 20-12-2013 | #17


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


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

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


Iska, Спасибо :-)
Прогнал скрипт в типичных задачах и вроде всё работает :-)
Единственный вопрос возник по этому поводу
Цитата Iska:
Да. И без замыкающего обратного слэша (т.е. «Exclude Folder 01», «Exclude Folder 02», «Exclude Folder 03\Folder4\Folder5» и т.п.). »
Если без слеша в конце то папка воспринимается как Exclude Folder 01* Т.е. если есть например ещё папка Exclude Folder 01Test то она тоже будет исключена. А если поставить слеш то нет. Также я попробовал в исключения папок добавлять пути до файла, например Test\Test.txt и это тоже вполне работает.

Отправлено: 07:42, 20-12-2013 | #18


Ветеран


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

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


Цитата DjBoBo:
Если без слеша в конце то папка воспринимается как Exclude Folder 01* Т.е. если есть например ещё папка Exclude Folder 01Test то она тоже будет исключена. »
Не додумал. Странно, печально, но факт. Поправил:
читать дальше »
Код: Выделить весь код
function GetMD5Hash([System.String]$sFile) {
    $oHashAlgorithm = [Security.Cryptography.HashAlgorithm]::Create("MD5")

    $oStreamReader = ([System.IO.StreamReader]$sFile).BaseStream
    
    -join ($oHashAlgorithm.ComputeHash($oStreamReader) | ForEach-Object -Process { "{0:x2}" -f $_ })
    $oStreamReader.Close()
}

$sRootPath       = "E:\Песочница\0328"
$sMD5ListPath    = "E:\Песочница\0336\MD5 List.txt"
$sExcludeFiles   = "E:\Песочница\0336\ExcludeFiles.txt"
$sExcludeFolders = "E:\Песочница\0336\ExcludeFolders.txt"


$cExcludeFiles   = @(Get-Content -Path $sExcludeFiles   -Encoding UTF8)
$cExcludeFolders = @(Get-Content -Path $sExcludeFolders -Encoding UTF8)


$cList = Get-ChildItem -Path $sRootPath -Recurse -Force |`
    Where-Object -FilterScript { -not $_.PSIsContainer -and $cExcludeFiles -notcontains $_.Name }
    
foreach($elem in $cExcludeFolders) {
    $cList = $cList | Where-Object -FilterScript { -not $_.FullName.StartsWith("$sRootPath\$elem\") }
}

"; Generated on $(Get-Date)", "; Total files: $($cList.Length)", ( $cList | ForEach-Object -Process {
    "$(GetMD5Hash $_.FullName) $($_.FullName.Substring($sRootPath.Length + 1))"
} ) | Out-File -FilePath $sMD5ListPath -Encoding UTF8

Цитата DjBoBo:
Также я попробовал в исключения папок добавлять пути до файла, например Test\Test.txt и это тоже вполне работает. »
Угу. Там сравнение шло по началу пути. В исправленном такое работать уже не должно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:00, 20-12-2013 | #19


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


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

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


Цитата Iska:
Не додумал. Странно, печально, но факт. Поправил: »
Цитата Iska:
Угу. Там сравнение шло по началу пути. В исправленном такое работать уже не должно. »
Ну если слеш в конце ничего не нарушает, а ещё к тому же и добавляет функционал по выборочному исключению не только папок но и отдельных конечных файлов то меня он вполне устраивает :-)
Думаю его и использовать...

Отправлено: 08:57, 20-12-2013 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Создать общий списк файлов в директориях antonyk Скриптовые языки администрирования Windows 6 14-01-2012 15:17
Proxy/NAT - Как реализовать задачу : минипровайдер внутри офиса. djeff Сетевые технологии 0 24-05-2010 11:15
VPN - Необходимо реализовать подключение Site-to-site extremal Сетевые технологии 6 25-03-2008 14:56
vsftpd: нет прав на удаления файлов в домашних директориях steepz Программное обеспечение Linux и FreeBSD 6 09-09-2006 16:37
Групповая политика в Активных директориях Vi-P Microsoft Windows NT/2000/2003 3 15-03-2006 17:45




 
Переход