2011-08-04 12 views
1

私はこのPerlコードを変更する助けが必要です。私はホスト上のすべてのサービスのリストを取得できます。しかし、私はRed(停止した)のサービスの電子メールメッセージを送信することにのみ関心があります。私はその条件をどこで設定するのかはわかりません(foreach内、おそらく)?今Perlで関連する行を選択するには?

出力:

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"; 
} 

答えて

2

あなたは(のみ関連している行を返す - 赤いものを)SQLクエリで条件に対処することができます。これはおそらくそれを処理する最善の方法です。 DBMSとクライアント間で送信されるデータを制限します(単一のマシンやLAN接続では問題にならないかもしれませんが、WAN接続では重要です)。

my $servSet = $wmiObj->ExecQuery("SELECT * FROM Win32_Service WHERE Started = 0", 
          "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly); 

$sstateは0(レッドに相当)である場合にのみ、あなたが$winsvcsに関連する情報を追加するように別の方法として、あなたはforループ内でテストを使用することができます。

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を変更することをお勧めしますが、選択肢はあなたのものです。

+0

@ cjd143SD:ご覧のとおり、私はどのようにしたらよいか説明しましたが、あなたのテクニックもうまくいくはずです。 –

+0

ご協力いただきありがとうございます。 – cjd143SD

+0

'ARRAYリファレンスではありません。 '、' $ serv($ {$ servSet})'を参照しています。 – cjd143SD

関連する問題