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

标签 powershell

这里是 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/

相关文章:

powershell - Azure Powershell如何通过Runbook获取VM的运行服务?

powershell - PowerShell日期时间转换

powershell - JobDSL 中的多行 powershell 命令

powershell - 在PowerShell中带括号的环境变量名称,例如%ProgramFiles(x86)%?

string - 如何在Powershell中删除部分字符串?

windows - 将 Sitecore PowerShell 扩展与 native PowerShell 结合使用

validation - 将 ValidateSet 与从 CSV 文件加载的内容一起使用

powershell - Chef PowerShell 日志记录/写入主机

Powershell:删除模块不会卸载嵌套模块中定义的全局[常量]变量

Powershell CSOM 多项选择复选框