在PowerShell中处理大量嵌套数据的最佳方法?

时间:2013-01-19 09:44:59

标签: powershell nested powershell-v3.0

我正在尝试自动化每日批次的日志文件验证。

我想检查大约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(我不熟悉),使用外部数据库,其他方法?

1 个答案:

答案 0 :(得分: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-script循环遍历服务器和批处理:

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