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