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

在powershell中处理大量嵌套数据的最佳方法?,powershell,nested,powershell-3.0,Powershell,Nested,Powershell 3.0,我正在尝试自动化我们日常批次的日志文件验证 我想检查大约20台服务器,这些服务器可能有多达30个批处理,每个批处理可以生成一个或多个日志文件,我想使用几个标准验证它们。 因此,最终会产生大量的数据 我的第一个想法是使用嵌套数组和哈希表,然后像这样创建psobject: $servers=@( @{ "name"="server1"; "credential"="domain\user"; "batch"=@( @{"batch

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

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

注意:对于xml,我是个新手,但我尝试了一下。这只是一个如何浏览xml文件的示例。:)

XML文件(test.XML):

输出:

PS-ADMIN C:\Windows\system32> test
Server: server1
Checking batch: test
Checking batch: mysql

XML可能是最明智的选择。至少要从PS脚本中拆分验证规则。不过,我对xml还不太熟悉,无法提供答案。谢谢Graimer,+1占用了您的一些时间,我在等着看是否还有其他答案。可能有更快的方法等,但最聪明的事情是至少将其分开,以便可以使用不同的多个“规则集”调用您的脚本。例如,您可以为每个服务(mysql集群、web集群)生成一个xml,并使用
“mysql test.xml”、“web test.xml”| MyProcess
或其他方法调用它们:-)我注意到,与v3相比,v3中有一个自动的foreach进程,因此您可以使用$xml.servers.server循环到每个服务器是的,您可以使用
$xml.servers.server |%{code..}
$xml.servers.server.servername
等。如果这是你的意思的话。我只是在使用xpath,因为我试图自己学习它,我试图使代码尽可能容易理解:)顺便说一句,修复了我注意到的答案中的一个小错误
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