这里是 PowerShell 菜鸟问题。我有一些服务器组列在单独的列表中。每个服务器都有一个错误日志,我可以扫描该日志以查找某些错误。但是,每组服务器都有其自己独特的错误集,我使用该服务器组的特定搜索字符串来扫描这些错误。我基本上所做的就是根据服务器列表名称创建一个条件,并为该服务器组映射适当的搜索字符串。
类似这样的事情:
$SERVER_LST_1 = "$pwd\servers\servers_1.lst"
$SERVER_LST_2 = "$pwd\servers\servers_2.lst"
$SERVER_LST_3 = "$pwd\servers\servers_3.lst"
$SEARCH_STR_1 = "Error text for server group 1"
$SEARCH_STR_2 = "Error text for server group 2"
$SEARCH_STR_3 = "Error text for server group 3"
$Servers1 = Get-Content $SERVER_LST_1
ForEach ($Server1 in $Servers1)
{
$StartupErrorLog1 = Get-ChildItem -Path \\$Server1\$LOG_PATH -Include StartupError.log -Recurse | Select-String -notmatch $SEARCH_STR_1
}
$Servers2 = Get-Content $SERVER_LST_2
ForEach ($Server2 in $Servers2)
{
$StartupErrorLog2 = Get-ChildItem -Path \\$Server2\$LOG_PATH -Include StartupError.log -Recurse | Select-String -notmatch $SEARCH_STR_2
}
$Servers3 = Get-Content $SERVER_LST_3
ForEach ($Server3 in $Servers3)
{
$StartupErrorLog3 = Get-ChildItem -Path \\$Server3\$LOG_PATH -Include StartupError.log -Recurse | Select-String -notmatch $SEARCH_STR_3
}
我希望不使用这么多条件来提高代码效率。是否有更干净的方法通过使用更少的代码将搜索字符串映射到适当的服务器组?希望这是有道理的。
最佳答案
您可以将其重构为如下所示:
$groups = @{
"$pwd\servers\servers_1.lst"="Error text for server group 1";
"$pwd\servers\servers_2.lst"="Error text for server group 2";
"$pwd\servers\servers_3.lst"="Error text for server group 3";
}
$startupErrors = @{}
$groups.keys | %{
$key = $_
gc $key | %{
$startupErrors[$_] = Get-ChildItem -Path \\$_\$LOG_PATH -Include StartupError.log -Recurse | Select-String -notmatch $groups["$key"]
}
}
基本上,使用哈希表将搜索文本与服务器组关联起来。另外,我只给出了重构解决方案,但 Get-ChildItem 和 Select-String 可能没有做你想做的事情。
关于powershell - 在 PowerShell 中,如何将列表映射到搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8888579/