2012-01-17 116 views
2

PowerShell noob问题在这里。我有单独列表中列出的服务器组。每台服务器都有一个错误日志,用于扫描某些错误。但是,每组服务器都有自己独特的一组错误,我使用该服务器组的特定搜索字符串进行扫描。我基本上做的是根据服务器列表名称创建一个条件,并为该服务器组映射适当的搜索字符串。在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 
} 

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

回答

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可能没有做到你想做的。

+0

感谢Manojlds。我会试试你的解决方案。 – Keith 2012-01-17 02:09:53

+0

嗨Manojlds - 只是跟进,你的解决方案效果很好!再次感谢!! – Keith 2012-01-17 17:13:04

+0

@Keith - 酷。你可以接受回答:) – manojlds 2012-01-17 17:18:24