Как выбрать соответствующие строки в Perl? - PullRequest
1 голос
/ 04 августа 2011

Мне нужна помощь, чтобы изменить этот код Perl.Я могу получить список всех услуг на хосте.Но меня интересует только отправка электронного сообщения для тех служб, которые Red (остановлены).Я не уверен, где я установил это условие (возможно, в foreach)?

Вывод:

Service: AeLookupSvc - Green - Auto
Service: Alerter - Red - Disabled
Service: ALG - Red - Manual
Service: AppMgmt - Green - Manual

Perl-код:

my @servstat = ("Red","Green");
my $computer = "localhost"; 
my $winsvcs;

my $wmiObj = Win32::OLE->GetObject("winmgmts:\\\\$computer\\root\\CIMV2")
 or die "WMI connection failed.\n";

#get all services
my $servSet = $wmiObj->ExecQuery("SELECT * FROM Win32_Service", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly);  

foreach my $serv (in $servSet) { 
     my $sname = $serv->{name};
     my $sstate = $serv->{started};
     my $ssmode = $serv->{startmode};
    $winsvcs .= "Service: " . $sname . " - " . $servstat[$sstate] . " - " . $ssmode . "\n";
 }

1 Ответ

2 голосов
/ 04 августа 2011

Вы можете иметь дело с условием в запросе SQL (возвращать только соответствующие строки - красные).Это, вероятно, лучший способ справиться с этим;он ограничивает данные, передаваемые между СУБД и клиентом (которые могут не иметь большого значения на одном компьютере или в соединении по локальной сети, но действительно имеют значение при соединении по глобальной сети).проверить в цикле for, чтобы добавить соответствующую информацию в $winsvcs только в том случае, если $sstate равно 0 (эквивалентно красному).

foreach my $serv (in $servSet)
{ 
    next if $serv->{started};
    my $sname  = $serv->{name};
    my $sstate = $serv->{started};
    my $ssmode = $serv->{startmode};
    $winsvcs  .= "Service: $sname - $servstat[$sstate] - $ssmode\n";
}

Обратите внимание, что оператор .необходимо (особенно если вам нужно встроить результат вызова функции), но на самом деле не было необходимости в коде, который вы показали.Можно даже обойтись без 3-х переменных цикла, но тогда строка станет довольно длинной.

    $winsvcs  .= "Service: $serv->{name} - $servstat[$serv->{started}] - $serv->{startmode}\n";

Оба метода будут работать.Я рекомендую модифицировать SQL, а не цикл, но выбор за вами.

...