В PowerShell, как отобразить список в строку поиска - PullRequest
2 голосов
/ 17 января 2012

Вопрос по 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 Ответ

3 голосов
/ 17 января 2012

Вы можете преобразовать его в нечто вроде ниже:

$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 могут не выполнять то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...