<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Vadims Podans's blog - PowerShell | FCIV</title>
    <link>http://www.sysadmins.lv/</link>
    <description>PowerShell powered</description>
    <image>
      <url>http://www.sysadmins.lv/images/imgusr/bilde.jpg</url>
      <title>Vadims Podans's blog - PowerShell | FCIV</title>
      <link>http://www.sysadmins.lv/</link>
    </image>
    <language>en-us</language>
    <copyright>Vadims Podāns</copyright>
    <lastBuildDate>Thu, 01 Oct 2009 19:12:11 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>vpodans@sysadmins.lv</managingEditor>
    <webMaster>vpodans@sysadmins.lv</webMaster>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=d8da596d-479d-4d4b-8601-113a8cd5c118</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=d8da596d-479d-4d4b-8601-113a8cd5c118</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>PS FCIV 1.0</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</link>
      <pubDate>Thu, 01 Oct 2009 19:12:11 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;После небольшого перерыва продолжаю допиливать свой вариант FCIV на PowerShell. И радостно могу сообщить, что уже есть версия 1.0, т.е. полностью отвечающая нашим требованиям. Что изменилось в новой версии?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Основная команда переименована с Get-PsFCIV в &lt;strong&gt;Start-PsFCIV&lt;/strong&gt;; &lt;/li&gt;    &lt;li&gt;Включена предварительная проверка файлов на блокировку; &lt;/li&gt;    &lt;li&gt;В связи с предыдущим пунктом, к&amp;#160; параметру &lt;strong&gt;Show&lt;/strong&gt; добавлен аргумент – &lt;strong&gt;Locked&lt;/strong&gt;. В это свойство помещаются заблокированные файлы (а для них нельзя подсчитать хеш); &lt;/li&gt;    &lt;li&gt;Включена проверка пути. Если путь к исходной папке не является путём файловой системы, то скрипт будет генерировать ошибку; &lt;/li&gt;    &lt;li&gt;Исправлена ошибка невозврата на исходный путь, если в процессе работы произошла фатальная ошибка; &lt;/li&gt;    &lt;li&gt;Параметр &lt;strong&gt;Show&lt;/strong&gt; теперь выводит файлы из указанных категорий в красивое графическое окошко с использованием &lt;strong&gt;Out-GridView&lt;/strong&gt;. Однако, следует учесть, что &lt;font color="#ff0000"&gt;использование Out-GridView требует, чтобы был установлен .NET Framework 3.5 SP1&lt;/font&gt;. &lt;/li&gt;    &lt;li&gt;Добавлен режим &lt;strong&gt;Quiet&lt;/strong&gt;, который ничего не выводит на экран, а только генерирует коды возврата (&lt;strong&gt;LastExitCode&lt;/strong&gt;). Коды возврата обновлены. &lt;/li&gt;    &lt;li&gt;Пофиксены сообщения режимов &lt;strong&gt;Verbose&lt;/strong&gt; и &lt;strong&gt;Debug&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Исправлены мелкие неточности в коде и произведена небольшая оптимизация кода. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;А теперь и on-line справка по всем параметрам по просьбе трудящихся.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Path&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — путь к папке, файлы которой следует посчитать или проверить. Допускаются относительные пути. Данный параметр обязателен. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;XML&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — путь к XML файлу, который содержит сведения о файлах. Если указанный файл не существует, то после пересчёта файлов по этому пути будет создан новый файл БД со сведениями о файлах. Параметр обязателен. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Include&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — опциональный параметр в котором вы можете указать только конкретный файл из папки. В таком случае будет проверена не вся папка, а только указанный файл. В настоящее время параметр не поддерживает подстановочные знаки (wildcard), типа '*.ext' из-за обеспечения поддержки файлов с метасимволами (например, в имени содержатся квадратные скобки). &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Action&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — опциональный параметр, который указывает на действие над файлами, у которых не совпадают хеши или сведения о дате изменения и размере файла. Может принимать значение &lt;strong&gt;Rename&lt;/strong&gt; или &lt;strong&gt;Delete&lt;/strong&gt;. В первом случае к проблемным файлам добавляется расширение .BAD, а во втором файл просто удаляется. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Show&lt;/strong&gt; &amp;lt;String[]&amp;gt;&lt;/font&gt; — опциональный параметр, в котором указываются категории файлов для дальнейшего анализа. В зависимости от результата проверки каждый файл (его имя) помещается в ту или иную категорию. &lt;font color="#ff0000"&gt;Требует установленного .Net Framework 3.5 SP1&lt;/font&gt;. Может принимать один или несколько аргументов из списка:       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;Bad&lt;/strong&gt; — содержит имена всех файлов, у которых обнаружен несовпадающий хеш или не совпадает дата/время изменеия и/или размер файла; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Locked&lt;/strong&gt; — в эту категорию помещаются файлы хеш которых проверить не удалось по причине блокировки файла в монопольном режиме каким-то приложением; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Missed&lt;/strong&gt; — содержит имена файлов, для которых есть запись в XML файле БД, но самого файла уже не существует (по любым причинам); &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; — в эту категорию попадают только имена новых файлов, для которых соответствующей записи ещё нет в XML файле. Новые файлы добавляются только в режиме Rebuild или когда файл БД создаётся с нуля. &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Ok&lt;/strong&gt; — сюда попадают файлы с успешным статусом проверки, т.е. хеш, дата/время изменения и размер файла совпадают со значениями в XML файле; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Total&lt;/strong&gt; — содержит имена всех обработанных файлов вне зависимости от результата проверки; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Unknown&lt;/strong&gt; — содержит имена файлов, для которых нельзя сопоставить хеш. Такая ситуация возможна, если в параметрах функции указан только хеш SHA1, но для файла в БД записан только MD5 хеш и наоборот. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Recurse&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — ключ, который включает проверку файлов не только в указанной папке, но и во всех вложенных папках. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Rebuild&lt;/strong&gt; &amp;lt;Swtich&amp;gt;&lt;/font&gt; — ключ, который задаёт особый режим работы скрипта — «освежение». Если этот ключ указан, то производится сверка файлов из БД с реальными файлами. Если файл более не существует, то соответствующая запись для него удаляется из БД. После чего целевая папка (и подпапки при указанном ключе –Recurse) проверяется на наличие новых файлов. Для каждого нового файла добавляется соответствующая запись в XML файл. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;SHA1&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — задаёт алгоритм хеширования, который будет использоваться для подсчёта новых файлов и/или для проверки уже существующих записей в XML файле. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;MD5&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — задаёт алгоритм хеширования, который будет использоваться для подсчёта новых файлов и/или для проверки уже существующих записей в XML файле. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Quiet&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает несопровождаемый режим работы скрипта. Если ключ указан, то итоговая статистическая информация не выводится на экран, а в зависимости от результата проверки генерируется код возврата (&lt;strong&gt;LastExitCode&lt;/strong&gt;). Код возврата может принимать одно из следующих значений:       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; — в процессе работы скрипта все файлы были успешно проверены и их хеш, дата/время изменения и размер соответствуют записям в БД. Так же, данный код возврата будет сгенерирован, если создавался новый файл БД и все файлы были успешно в него добавлены; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; — в процессе проверки были обнаружены файлы с несовпадающим хешем и/или датой/временем и размером; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; — в процессе проверки было обнаружено, что для записи в БД нет соответствующего файла; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; — в процессе проверки были обнаружены файлы, для которых не удалось сопоставить алгоритм хеширования с хранимым в БД алгоритмом хеширования для файла. Такая ситуация возможна, если в параметрах функции указан только хеш SHA1, но для файла в БД записан только MD5 хеш и наоборот; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; — в процессе работы скрипта для некоторых файлов не удалось подсчитать хеш по причине блокировки файла в монопольном режиме другим приложением; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; — скрипт выполнялся в режиме &lt;strong&gt;Rebuild&lt;/strong&gt; (освежения файла БД) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Verbose&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает отображение дополнительной информации о ходе проверки файлов. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Debug&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает отображение отладочной информации о ходе работы скрипта. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Несколько примеров использования:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Show&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Bad, Missed&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет проверена папка &lt;strong&gt;C:\Files&lt;/strong&gt; и все вложенные папки. Файл &lt;strong&gt;db.xml&lt;/strong&gt; должен быть размещён непосредственно в этой папке. Если файл не существует, то будет создан с нуля. После проверки будет показано графическое окно с именами файлов, которые попали в категорию &lt;strong&gt;Bad&lt;/strong&gt; и &lt;strong&gt;Missed&lt;/strong&gt;. Для каждой категории будет отдельное графическое окно.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-MD5&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Include&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;data.dat&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет проверен только файл &lt;strong&gt;data.dat&lt;/strong&gt; в папке &lt;strong&gt;C:\Files&lt;/strong&gt; с использованием &lt;strong&gt;SHA1&lt;/strong&gt; алгоритмом хешиования. Если для файла в БД записан только &lt;strong&gt;MD5&lt;/strong&gt; хеш, то проверка будет произведена с использованием MD5. Если файл БД (db.xml) не существует, то создастся новый файл БД со сведениями о файле &lt;strong&gt;data.dat&lt;/strong&gt;. Файл будет подсчитан с использованием как SHA1, так и MD5.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-MD5&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Rebuild&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет произведено освежение файла БД для папки &lt;strong&gt;C:\Files&lt;/strong&gt;. Все записи, для которых соответствующего файла не обнаружено, будут удалены. Если в папке есть файлы, для которых нет соответствующей записи, то они будут обсчитаны с использованием алгоритмов SHA1 и MD5 и будут добвлены в XML файл. Файл &lt;strong&gt;db.xml&lt;/strong&gt; должен существовать, иначе скрипт вернёт фатальную ошибку.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Quiet&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Папка &lt;strong&gt;C:\Files&lt;/strong&gt; будет проверена в несопровождаемом режиме с использованием алгоритма SHA1. По умолчанию никакой информации на экране не будет. После окончания работы, в зависимости от результатов проверки, скрипт сгенерирует соответствующий код возврата (&lt;strong&gt;0-5&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;И, собственно, сам скрипт:&lt;/p&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;38,3 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self" alt="Download File"&gt;PSFCIV_1.0.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;И как обычно, любые замечания, комментарии постить в каменты.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=d8da596d-479d-4d4b-8601-113a8cd5c118"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b</wfw:commentRss>
      <title>PS FCIV (часть 3)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</link>
      <pubDate>Thu, 09 Jul 2009 21:43:12 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;И я снова вернулся. После последнего анализа кода была обнаружена серьёзная ошибка в коде, из-за которой пришлось его очень сильно переписывать. Поэтому я предлагаю оценить RC версию скрипта, который уже выполняет свою задачу, которая расписана в предыдущих статьях.&lt;/p&gt;  &lt;div&gt;   &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; height: 66px; margin-left: auto; border-left-width: 0px; margin-right: auto" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt;&lt;span style="line-height: 1.25em; display: block; cursor: pointer; padding-top: 1px" title="Download file"&gt;PS1 file              &lt;br /&gt;25,5 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self" alt="Download File"&gt;PSFCIV_0.85.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt; &lt;/div&gt; Итак, как с этим скриптом начинать работать. В скрипте есть 3 обязательных параметра: путь к папке, которую нужно посчитать или проверить, путь к XML файлу (если файла нету, то он будет создан) и как минимум 1 алгоритм хеширования. Т.е. минимум это должно выглядеть вот так:   &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;.\PSFCIV_0.85.ps1 C:\Temp –xml DB.XML –sha1&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;При этом можно указать алгоритм &lt;font color="#0000ff"&gt;–md5&lt;/font&gt; или оба сразу (&lt;font color="#0000ff"&gt;-sha1 –md5&lt;/font&gt;). В таком случае для каждого файла будет сгенерировано 2 хеша. Без указания любого из этих параметров будет сгенерирована ошибка и работа будет остановлена.&lt;/p&gt;  &lt;p&gt;Опциональные параметры:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Include&lt;/strong&gt; file.ext&lt;/font&gt; – будет произведена проверка только указанного файла; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Recurse&lt;/strong&gt;&lt;/font&gt; – будет произведена проверка всех файлов в папке и подпапках; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Rebuild&lt;/strong&gt;&lt;/font&gt; – особый режим обновления XML файла, из которого будут удалены устаревшие записи и если есть новые файлы в папке или папках, то они будут добавлены в XML файл. Данный ключ требует наличия XML файла. Если файл БД не будет обнаружен, то будет выведена соответствующая ошибка. При этом режиме проверка целостности файлов не проверяется. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Verbose&lt;/strong&gt; brief/full&lt;/font&gt; – включает один из режимов вывода информации о ходе проверки на консоль. Можно выбрать Brief – упрощённый или Full – максимальный. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Show&lt;/strong&gt; Total/New/Ok/Bad/Miss&lt;/font&gt; – включает дополнительный режим вывода на экран одной из выбранных категорий. Например, всех проверенных файлов, только новых файлов, которые добавлены в БД, только файлов, которые прошли проверку, только файлы с несоответствующим хешем или только файлы, для которых есть запись в БД, но самого файла уже нету. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Force&lt;/strong&gt; Rename/Delete&lt;/font&gt; – включает режим действия над проблемными файлами. Можно выбрать – переименования (тогда к файлу будет добавлено расширение &lt;strong&gt;.BAD&lt;/strong&gt;) или удаления файла. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;На данном этапе реализована работа в соответствии с логикой (которая описана тут: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx"&gt;PS FCIV (часть 1)&lt;/a&gt;) и односторонняя совместимость с FCIV. Т.е. этой утилите можно скармливать XML файл, который сгенерирован с помощью этого скрипта. В скрипте начата реализация поддержки альтернативных БД, которые не совместимы с FCIV XML. Плюс планируется обеспечение двусторонней поддержки FCIV – т.е. скрипт сможет корректно воспринимать и обрабатывать XML файлы, которые сгенерированы утилитой FCIV. Ну и оптимизация самого кода. Сам скрипт снабжён достаточно плотными комментариями, поэтому будет совсем нетрудно с ним разобраться. По мере дописывания кода буду выкладывать более актуальные версии файла.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Update 27.07.2009&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Скрипт &lt;strong&gt;PsFCIV.ps1&lt;/strong&gt; переписан в виде &lt;em&gt;Advanced Function&lt;/em&gt; под именем &lt;strong&gt;Get-PsFCIV&lt;/strong&gt;. Теперь его достаточно загрузить в консоль используя &lt;em&gt;dot-sourcing&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Добавлена справка для функции. После загрузки функции в консоль достаточно набрать команду: &lt;strong&gt;Get-Help Get-PsFCIV&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;По умолчанию на экран не выводится никакой информации, а только коды возврата. Коды возврата описаны в справке. &lt;/li&gt;    &lt;li&gt;Изменён ключ &lt;strong&gt;-Verbose&lt;/strong&gt;. Теперь используется стандартный ключ &lt;strong&gt;-Verbose&lt;/strong&gt; для вывода расширенной информации. Аргументы не принмаются.&lt;/li&gt;    &lt;li&gt;Добавлен стандартный ключ &lt;strong&gt;-Debug&lt;/strong&gt; для вывода диагоностической информации. &lt;/li&gt;    &lt;li&gt;Добавлена поддержка обработки XML файла сгенерированного утилитой FCIV (т.е. совместимость с FCIV теперь двусторонняя). &lt;/li&gt;    &lt;li&gt;Ключ &lt;strong&gt;-Force&lt;/strong&gt; заменён на ключ &lt;strong&gt;-Action&lt;/strong&gt; с сохранением аргументов.&lt;/li&gt;    &lt;li&gt;К ключу &lt;strong&gt;-Show&lt;/strong&gt; добавлен ещё один аргумент &lt;strong&gt;Unknown&lt;/strong&gt; для индикации файлов с неопределённым результатом проверки. Такое состояние у файла может быть в случае, если не удалось сопоставить алгоритмы хеширования. Т.е. когда при вызове функции указывается алгоритм –SHA1, но в XML файле есть только MD5 хеш и наоборот.&lt;/li&gt; &lt;/ul&gt;  &lt;div&gt;   &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file              &lt;br /&gt;32,4 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self" alt="Download File"&gt;PSFCIV_0.88.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=29898a6c-aceb-4738-82d8-318bc89272cc</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=29898a6c-aceb-4738-82d8-318bc89272cc</wfw:commentRss>
      <title>PS FCIV (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</link>
      <pubDate>Fri, 03 Jul 2009 20:26:05 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжаем повествование о процессе разработки функционального аналога FCIV.&lt;/p&gt;  &lt;h1 align="center"&gt;Подсчёт хешей и кодирование в Base64 String&lt;/h1&gt;  &lt;p&gt;Как я уже упоминал, самая первая и основная функциональная часть – функция подсчёта хешей. Я уже делал скрипт, который считает хеши: &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!201.entry"&gt;Полезная безделушка Hash SHA1 на PowerShell&lt;/a&gt;, который и стал основой моего скрипта. Однако, по одной причине саму считалку пришлось обрезать. Если посмотреть справку по FCIV (&lt;a href="http://support.microsoft.com/kb/841290"&gt;http://support.microsoft.com/kb/841290&lt;/a&gt;), то он не записывает в БД реальный хеш файла, а пропускает его ещё через &lt;strong&gt;Base64&lt;/strong&gt; кодировку и закодированный хеш уже записывается в XML файл. В .NET уже есть стандартный кодировщик Base64, который на входе принимает массив байтов. Если посмотреть на указанный пост из моего блога, то там я приводил вывод объекта &lt;strong&gt;$hasher&lt;/strong&gt;, который как раз и является байтовым массивом, который мы потом преобразовывали в строку. Здесь же преобразовывать в строку ничего не нужно, а сразу подаём этот массив в конвертер. Вот как выглядит функция подсчёта хеша:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_hashbytes_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;sha1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Create&lt;/span&gt;&lt;span style="color: #000000"&gt;()}
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;md5&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.MD5&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Create&lt;/span&gt;&lt;span style="color: #000000"&gt;()}
    }
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.IO.StreamReader&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$hashBytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt;.ComputeHash(&lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;.BaseStream)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;.Close()
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$hashBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;в качестве аргументов мы принимаем тип хеша – &lt;strong&gt;MD5&lt;/strong&gt; или &lt;strong&gt;SHA1&lt;/strong&gt; и сам файл:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] _hashbytes_ sha1 wsr.txt
7
11
122
247
126
249
232
24
193
38
194
124
237
202
26
183
178
64
173
45
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::ToBase64String($(_hashbytes_ sha1 wsr.txt))
Bwt693756BjBJsJ87coat7JArS0=
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::ToBase64String($(_hashbytes_ md5 wsr.txt))
kshzMfHPdtuXdL6l/vWwPA==
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;я подсчитал SHA1 хеш для текстового файла и на выходе получил такой же по структуре массив байтов, как и в предыдущей статье. И далее я этот массив подал в качестве аргумента для конвертера Base64 строки (статический метод &lt;a href="http://msdn.microsoft.com/en-us/library/dhx0d524.aspx" target="_blank"&gt;ToBase64String&lt;/a&gt; класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.aspx" target="_blank"&gt;System.Convert&lt;/a&gt;), а на выходе уже получил правильную Base64 строку. Именно эту строку FCIV записывает в файл. То же самое будем делать и мы. Кстати говоря. обратное преобразование делается через тот же класс&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.aspx" target="_blank"&gt;System.Convert&lt;/a&gt;, но с использованием метода &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx" target="_blank"&gt;FromBase64String&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::FromBase64String(&amp;quot;Bwt693756BjBJsJ87coat7JArS0=&amp;quot;)
7
11
122
247
126
249
232
24
193
38
194
124
237
202
26
183
178
64
173
45
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] -join ([System.Convert]::FromBase64String(&amp;quot;Bwt693756BjBJsJ87coat7JArS0=&amp;quot;) | %{&amp;quot;{0:X2}&amp;quot; -f $_})
070B7AF77EF9E818C126C27CEDCA1AB7B240AD2D
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;как видите, массив байтов получился точно такой же. Второй строкой я показал, как можно собрать строку самого хеша, которую показывают различные программы подсчёта хешей. Как можно заметить все числа в массиве меньше, чем 256, т.е. не превышают значения 2&lt;sup&gt;8&lt;/sup&gt;, что является 1 байтом в двоичной форме. В цикле &lt;strong&gt;Foreach-Object&lt;/strong&gt; я преобразовываю каждый байт в &lt;strong&gt;HEX&lt;/strong&gt; и собираю в единую строку оператором &lt;strong&gt;–Join&lt;/strong&gt;, который доступен только в PowerShell V2. Но можно собрать и через &lt;strong&gt;[System.String]::Join()&lt;/strong&gt; для PowerShell 1.0.&lt;/p&gt;

&lt;h1 align="center"&gt;Генерация FCIV-совместимого XML файла&lt;/h1&gt;

&lt;p&gt;Если посмотреть в статью по FCIV, то увидим, что он использует свою нестандартную XML схему:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FCIV&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;wsr.txt&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;Bwt693756BjBJsJ87coat7JArS0=&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;0&lt;/strong&gt;&amp;lt;/&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;xd/Rh0JyuW/I6sxPzY4sULyjS38=&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FCIV&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;По этой причине мы лишаемся возможности использования &lt;strong&gt;Export-CliXML&lt;/strong&gt; и подобных команд, а нужно собирать вручную.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Внимание:&lt;/font&gt;&lt;/strong&gt; хоть FCIV и непривередлив к дополнительным полям в XML, но он начинает сильно ругаться, если поле Name написано с большой буквы. Его нужно заполнять так, как он есть в экземпляре, т.е. все маленькие буквы.&lt;/p&gt;

&lt;p&gt;Объект, который будет хранить все данные о файле будет вот такой:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Т.е. мы в XML будем писать имя файла, его размер в байтах, время и дату последней модификации файла и хеши SHA1 и MD5. Если при создании БД мы будем использовать только один хеш, то второй будет просто пустым. Для сборки XML нам потребуется потребуется функция. Эту схему можно разложить на 3 составные части:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;заголовок XML и открывающийся тег &lt;strong&gt;&amp;lt;FCIV&amp;gt;&lt;/strong&gt;. Это присуствует только в начале XML файла и всё. Этот тег и заголовок больше нигде в XML не встречается. Поэтому header и открывающийся тег нужно поместить в скриптоблок &lt;strong&gt;Begin&lt;/strong&gt; функции.&lt;/li&gt;

  &lt;li&gt;А вот теги &lt;strong&gt;&amp;lt;FILE_ENTRY&amp;gt;&lt;/strong&gt; они повторяются для каждой записи. Следовательно этот тег будем заполнять в конструкции Process функции. Т.е. в каждой итерации &lt;strong&gt;Process&lt;/strong&gt; будет создаваться новый тег &lt;strong&gt;&amp;lt;FILE_ENTRY&amp;gt;&lt;/strong&gt;. Но внутри этого тега есть ещё вложенные теги, которые описывают наш файл. Чтобы решить эту задачу мы должны внутри конструкции &lt;strong&gt;Process&lt;/strong&gt; (которая по сути будет являться циклом) написать ещё один цикл, который будет разбирать входящий объект и данные из его свойств записывать во вложенные теги.&lt;/li&gt;

  &lt;li&gt;В конце XML файла будет закрывающийся тег &lt;strong&gt;&amp;lt;/FCIV&amp;gt;&lt;/strong&gt;, его будем помещать в скриптоблок End нашей функции.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt; Вот такая функция у меня получилась:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_toxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в Begin создаём заголовок XML и открывающийся тег &amp;lt;FCIV&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Begin&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;?xml version=`&amp;quot;1.0`&amp;quot; ?&amp;gt;`n &amp;lt;FCIV&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в Process будут по одному поступать объекты, которые описывают файл.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Process&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; для каждого файла у нас будет один тег &amp;lt;FILE_ENTRY&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;FILE_ENTRY&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; чтобы вручную не создавать и не заполнять вложенные теги мы простым foreach&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; перечисляем теги, какие у нас будут в XML и за счёт переменных автоматом&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём их в XML и заполняем их данными. Для этого свойства объектов должны&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; называться так же, как и теги.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$child&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;$child&amp;gt;$($_.$child)&amp;lt;/$child&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда текущий объект обработан, закрываем тег и ждём следующий объект файла&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;/FILE_ENTRY&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда объекты закончились, закрываем первый тег &amp;lt;FCIV&amp;gt; и подаём полученный XML дальше&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/FCIV&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;в ходе испытаний нарвался на одну засаду. В XML существуют некоторые символы как ‘&lt;strong&gt;&amp;amp;&lt;/strong&gt;’, ‘&lt;strong&gt;&amp;lt;&lt;/strong&gt;’, ‘&lt;strong&gt;&amp;gt;&lt;/strong&gt;’ и другие (полный список перечислен тут: &lt;a title="http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm" href="http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm"&gt;http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm&lt;/a&gt;), которые нужно эксейпить, поскольку являются метасимволами в XML. Эти символы (в частности одинарная кавычка и амперсанд) могут присутствовать в имени файла. Погуляв по сайту MSDN нашёл выход. Выход заключается в использовании метода &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape.aspx" target="_blank"&gt;Escape&lt;/a&gt; класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.securityelement.aspx" target="_blank"&gt;System.SecurityElement&lt;/a&gt;. Поэтому после того как массив объектов (которые описывают каждый файл) будет собран его нужно пропустить через фильтр и только после этого собирать XML вышеприведённой функцией. Вот как выглядит фильтр:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_escxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; {
    &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;Security.SecurityElement&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name)
    &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Напоминаю, что мы должны эскейпить только свойство Name нашего объекта.&lt;/p&gt;

&lt;h1 align="center"&gt;Преобразование FCIV-совместимого XML в массив объектов&lt;/h1&gt;

&lt;p&gt;Вот мы уже научились правильно создавать XML файл, который будет полностью совместим со схемой, которая используется в самом FCIV. Теперь у нас возникает задача чтения этого XML и преобразования в массив объектов. Сначала я долго горевал, плакал и бился головой об стену, что нельзя использовать &lt;strong&gt;Import-CliXML&lt;/strong&gt;, но преобразование типов решило задачу ничуть не сложнее:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_fromxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$xml&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;xml&lt;/span&gt;&lt;span style="color: #000000"&gt;]$(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-LiteralPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$xml&lt;/span&gt;&lt;span style="color: #000000"&gt;)).FCIV.FILE_ENTRY | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;сначала читаем файл и преобразовываем его в типа данных XML, опускаем теги &lt;strong&gt;FCIV&lt;/strong&gt; и &lt;strong&gt;FILE_ENTRY&lt;/strong&gt; и в цикле разбираем вложенные теги и собираем объект. Получилось достаточно просто. На сегодня, я думаю, что хватит, продолжение следует.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=29898a6c-aceb-4738-82d8-318bc89272cc"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=22a8186c-615b-41fa-8062-d74e1a2a28e0</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=22a8186c-615b-41fa-8062-d74e1a2a28e0</wfw:commentRss>
      <title>PS FCIV (часть 1)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</link>
      <pubDate>Thu, 02 Jul 2009 19:38:14 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;После продолжительного затишья вызванного различными причинами (как выступление на MCP клубе в Москве), продолжаю тему PowerShell. На этот раз реализованный на PowerShell аналог &lt;STRONG&gt;File Checksum Integrity Verifier&lt;/STRONG&gt; (&lt;EM&gt;FCIV&lt;/EM&gt;) с расширенным функционалом по просьбе &lt;A href="http://pronichkin.com/default.aspx" target=_blank&gt;Артёма Проничкина&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;У каждого системного администратора&amp;nbsp; имеется некоторый файловый ресурс, который содержит такие вещи как инсталляционные ресурсы для своей компании и зачастую эти ресурсы достаточно большие и очень важно отслеживать целостность каждого файла, что он не был случайно модифицирован dbhecjv или как-то иначе повреждён. А так же контролировать появление новых файлов и удаление имеющихся файлов. Так же при обмене файловыми ресурсами можно использовать данный скрипт (который будет опубликован чуть позже) для проверки целостности передачи данных по сети. Например, сформировали комплект файлов для пересылки по сети. Сначала заготавливается исходная БД и это всё передаётся по сети в точку назначения, где применяют этот же скрипт и приложенную БД и проверяют, все ли файлы пришли целыми.&lt;/P&gt;
&lt;P&gt;Для решения этой задачи Microsoft в своё время выпустила утилиту &lt;STRONG&gt;FCIV&lt;/STRONG&gt; - &lt;A title=http://support.microsoft.com/kb/841290 href="http://support.microsoft.com/kb/841290"&gt;http://support.microsoft.com/kb/841290&lt;/A&gt;. Суть работы этой утилиты заключается в том, что она в указанной папке (и подпапках по желанию) подсчитывает хеш каждого файла и заносит его значение в свою БД. БД представляет собой обычный XML файл, который содержит имя и хеш-сумму для файла. При повторной проверки утилита считывает данные из XML файла, подсчитывает для каждого файла хеш и сравнивает его с тем, который записан в БД. Собственно, это весь функционал утилиты. Чтобы расширить функционал этой утилиты пришлось написать свой скрипт, который решает эту задачу. Причём этот скрипт будет полностью совместим с FCIV, хоть и использует свои механизмы подсчёта файлов и генерации XML файла.&lt;/P&gt;
&lt;P&gt;Самое первое – правильно составить логику работы скрипта:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;ищем XML &lt;BR&gt;если XML есть &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; берём список файлов из XML &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; эталонные хеши тоже из XML &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; реальные хеши добываем при обсчёте файлов &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; сравниваем со всеми вытекающими последствиями &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; если файл есть в XML, а в папке нету - плачем &lt;BR&gt;если XML нету &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ничего не сравниваем &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; считаем хеши всех файлов в папке &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; записываем их в XML&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Как оказалось, FCIV оказался непривередливым в отношении полей в XML файле, поэтому я решил добавить 2 своих поля – дата последней модификации и размер файла в байтах. Добавив 2 новых поля я позволил немного сократить общее время работы скрипта: как известно, подсчёт хешей для файлов процесс ресурсоёмкий (по CPU и по времени) и если мы при сравнении обнаружим, что изменились либо дата последней модификации, либо размер файла, то пересчитывать для него хеш совершенно не обязательно, поскольку есть 100% вероятность, что он не совпадёт с тем, что записан в БД. Итак, описание функционала скрипта:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;возможность подсчёта хешей файлов не только в текущей папке, но и подпапках; 
&lt;LI&gt;возможность проверки только одного файла из БД; 
&lt;LI&gt;возможность проверки файлов только с определёнными расширениями; 
&lt;LI&gt;возможность подсчёта хешей: &lt;STRONG&gt;MD5&lt;/STRONG&gt; или &lt;STRONG&gt;SHA1&lt;/STRONG&gt;. А так же есть возможность подсчёта обоих типов хешей с записью всех результатов в файл БД; 
&lt;LI&gt;возможность контроля даты и времени последней модификации файла с точностью до секунды и размера файла с точностью до байта; 
&lt;LI&gt;3 режима вывода служебной информации: без вывода, с минимальным выводом и с полным выводом служебной информации; 
&lt;LI&gt;итоговая статистика, которая будет показывать общее количество проверенных файлов и количество файлов с определённым статусом (хороший/изменённый/отсутствующий/вновь добавленный); 
&lt;LI&gt;полная обратная совместимость с FCIV; 
&lt;LI&gt;возможность указания действия для изменённых файлов на выбор (переименование или удаление); 
&lt;LI&gt;поскольку БД статическая и при сверке новые файлы в каталогах не проверяются и устаревшие записи не удаляются, поэтому был добавлен отдельный режим &lt;STRONG&gt;ReSync&lt;/STRONG&gt;, который будет очищать записи для несуществующих более файлов и заносить в БД новые файлы, которые появляются в проверяемых папках. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Тело скрипта разбито на несколько функциональных частей:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;функция подсчёта хешей; 
&lt;LI&gt;генерация FCIV-совместимого XML файла; 
&lt;LI&gt;преобразование FCIV-совместимого XML файла в массив объкектов; 
&lt;LI&gt;организация итоговой статистики работы; 
&lt;LI&gt;обеспечение основной логики работы. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Это была вводная часть в достаточно длительную эпопею с реализацией заданного функционала. В следующих частях в деталях будет рассмотрена каждая функциональная часть скрипта и в конце повествования будет опубликован сам скрипт, поэтому не отключайтесь.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=22a8186c-615b-41fa-8062-d74e1a2a28e0"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
    </item>
  </channel>
</rss>