Лучший способ обработки большого количества вложенных данных в powershell?

Я пытаюсь автоматизировать проверку файлов журналов нашей ежедневной партии.

Я хочу проверить около 20 серверов, которые могут иметь до 30 пакетов, каждый пакет может генерировать один или несколько файлов журналов, и я хочу проверить их по нескольким критериям.
Таким образом, в итоге получается довольно большой объем данных.

Сначала я использовал вложенные массивы и хеш-таблицы, а затем создал psobject следующим образом:

$servers=@(
    @{
     "name"="server1";
     "credential"="domain\user";
     "batch"=@(
                @{"batchName"="test";"path"="e:\cit\sauvegarde\batch\recup.cmd";"comment"="batch de test";"schedule"="lundi,mardi ";
                    "validations"=@(
                        @{"name"="log exist";"path"="\\smacweb\e$\cit\test.log";"filter"=@("NotNull";"NotOlderThan,2") };
                        @{"name"="no erros";"path"="\\smacweb\CIT\sauvegarde\logs\*.log";"filter"=@("NotContains,'error'") };
                )};
                @{"batchName"="mysql";"comment"="dump des bases mysql";"schedule"="lundi,mardi,vendredi";
                    "validations"=@(
                        @{"name"="log exist";"path"="\\smacweb\e$\mysqldump\dump.zip";"filter"=@("NotNull";"NotOlderThan,2") };
                        @{"name"="zipOK";"path"="\\smacweb\e$\mysqldump\dump.zip";"filter"=@("Test-Zip") };
                )};
       )
    };
#     @{
#     "name"="server2";
#     "credential"="domain\user2";
#     "batch"=@(
#                @{"batchName"=.....};
#     )};
)

$srv=@()
$servers | % {
        $srv+= New-Object -TypeName psobject -Property $_;
}

Это небольшой пример, но я думаю, что он быстро станет трудночитаемым. Так что было бы лучше сделать это? Использовать xml (мне не знакомо), использовать внешнюю базу данных, другой метод?


person Loïc MICHEL    schedule 19.01.2013    source источник
comment
XML, вероятно, является самым разумным выбором. Хотя бы отделить правила валидации от PS-скрипта. Я недостаточно знаком с xml, чтобы дать ответ.   -  person Frode F.    schedule 19.01.2013


Ответы (1)


Предупреждение: я новичок в xml, но я попробовал ради интереса. Это всего лишь пример того, как вы можете перемещаться по xml-файлу. :)

XML-файл (test.xml):

<?xml version="1.0" encoding="utf-8"?>
<servers>
  <server>
    <servername>server1</servername>
    <credential>domain\user</credential>
    <batches>
      <batch>
        <batchname>test</batchname>
        <batchpath>e:\cit\sauvegarde\batch\recup.cmd</batchpath>
        <comment>batch de test</comment>
        <schedule>
          <day>lundi</day>
          <day>mardi</day>
        </schedule>
        <validations>
          <validation>
            <name>log exist</name>
            <path>\\smacweb\e$\cit\test.log</path>
            <filters>
              <filter>NotNull</filter>
              <filter>NotOlderThan,2</filter>
            </filters>
          </validation>
          <validation>
            <name>no erros</name>
            <path>\\smacweb\CIT\sauvegarde\logs\*.log</path>
            <filters>
              <filter>NotContains,'error'</filter>
            </filters>
          </validation>
        </validations>
      </batch>
      <batch>
        <batchname>mysql</batchname>
        <comment>dump des bases mysql</comment>
        <schedule>
          <day>lundi</day>
          <day>mardi</day>
          <day>vendredi</day>
        </schedule>
        <validations>
          <validation>
            <name>log exist</name>
            <path>\\smacweb\e$\mysqldump\dump.zip</path>
            <filters>
              <filter>NotNull</filter>
              <filter>NotOlderThan,2</filter>
            </filters>
          </validation>
          <validation>
            <name>zipOK</name>
            <path>\\smacweb\e$\mysqldump\dump.zip</path>
            <filters>
              <filter>Test-Zip</filter>
            </filters>
          </validation>
        </validations>
      </batch>
    </batches>
  </server>
</servers>

Powershell-скрипт для перебора серверов и пакетов:

function test {
    $xml = [xml](Get-Content C:\Users\Frode\Desktop\test.xml)

    $servers = $xml.SelectNodes("/servers/server")

    foreach ($server in $servers) {
        $batches = $server.SelectNodes("batches/batch")

        Write-Host "Server: $($server.servername)"
        foreach ($batch in $batches) {
            Write-Host "Checking batch: $($batch.batchname)"
        } 
    }
}

Выход:

PS-ADMIN C:\Windows\system32> test
Server: server1
Checking batch: test
Checking batch: mysql
person Frode F.    schedule 19.01.2013
comment
спасибо, Граймер, +1 за то, что уделили вам немного времени, я жду, есть ли другие ответы - person Loïc MICHEL; 19.01.2013
comment
нп. могут быть более быстрые способы и т. д., но разумнее всего, по крайней мере, разделить его, чтобы ваш скрипт можно было вызывать с разными и несколькими наборами правил. Бывший. вы можете создать xml для каждой службы (mysql-кластер, веб-кластер) и вызывать их все, используя "mysql-test.xml", "web-test.xml" | MyProcess или что-то в этом роде :-) - person Frode F.; 19.01.2013
comment
Я просто заметил, что в версии 3 есть автоматический процесс foreach, поэтому вы можете просто использовать $xml.servers.server для зацикливания на каждом сервере. - person Loïc MICHEL; 22.01.2013
comment
Да, вы можете использовать $xml.servers.server | % { code.. } или $xml.servers.server.servername и т. д., если вы это имели в виду. Я просто использую xpath, потому что пытаюсь изучить его сам, и я старался сделать код как можно более простым для понимания :) кстати, исправил небольшую опечатку в ответе, которую я заметил - person Frode F.; 22.01.2013