在PowerShell中,如何将列表映射到搜索字符串

时间:2012-01-17 01:21:16

标签: powershell

PowerShell noob问题在这里。我有一组服务器列在单独的列表中。每个服务器都有一个错误日志,我扫描某些错误。但是,每组服务器都有自己唯一的错误集,我使用该服务器组的特定搜索字符串进行扫描。我基本上做的是基于服务器列表名称创建条件并映射该服务器组的相应搜索字符串。

这样的事情:

$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
}

我想通过不使用这么多条件来提高代码效率。是否有更简洁的方法通过使用更少的代码将搜索字符串映射到适当的服务器组?希望这是有道理的。

1 个答案:

答案 0 :(得分: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"]
    }
}

基本上,使用HashTable关联搜索文本和服务器组。另外,我只给出了重构解决方案,但Get-ChildItem和Select-String可能没有按照你想要的那样做。