2012-10-16 20 views
0

我有以下功能,我註冊停止服務事件。 服務停止後,我想在該事件中顯示該ServiceName。但是,不知何故,下面的代碼不想打印服務名稱?Register-WmiEvent(Win32_ProcessStopTrace) - 如何在-Action開關中使用變量?

請參閱Write-Host $ControllerSvc,」 stopped 」在 - 行動開關它打印只是「停止」。但是,如果我的代碼更改爲這是罰款 -

Write-Host $e.ProcessName,」 stopped 」(我不希望因爲我的過程或imagename是同樣爲所有的服務它像SVCHOST)

function Stop-MyService($SystemName) 
{ 
    $ControllerSvc = $SystemName+"Controller" 

    $svc = gwmi win32_service -filter "name = `"$ControllerSvc`"" 
    $ControllerPid = $svc.ProcessId 


    Register-WMIEvent -query 「SELECT * FROM Win32_ProcessStopTrace WHERE ProcessID=$ControllerPid」 -SourceIdentifier 「ControllerSvcEvent」 -action { 
    $e = $Event.SourceEventArgs.NewEvent 
    Write-Host $ControllerSvc,」 stopped 」 #**** never prints out the variable**** 
    unregister-event -sourceIdentifier 「ControllerSvcEvent」  
    } 

    Stop-Service $ControllerSvc 
} 

NB:爲了簡單起見,我在這裏展示了一種服務。其實 有多種服務,其中停止其中一個停止 其他人。所以,我想顯示在事件中停止的服務名稱 。

回答

0

嘗試通過$ControllerSvc通過Register-WMIEvent-MessageData參數,那麼就應該通過$Event可以訪問,根據this article

+0

不起作用。我試過這個 - 「註冊WMIEvent -query」選擇*從Win32_ProcessStopTrace WHERE ProcessID = $ ControllerPid「-SourceIdentifier」ControllerSvcEvent「-MessageData $ ControllerSvc -action { $ e = $ Event.SourceEventArgs.NewEvent 寫主機$ ControllerSvc, 「停止」 unregister-event -sourceIdentifier「ControllerSvcEvent」 } ' –

+1

是的,但是您需要將'Write-Host $ ControllerSvc'更改爲'Write-Host $ Event.MessageData'。 – Neolisk

2

這裏是我用另一個查詢完成的任務,註冊Win32_Service.State值爲'Stopped'的Win32_Service修改事件。我用$ Event.SourceEventArgs.NewEvent.TargetInstance.Name獲得服務名稱:

function Stop-MyService($SystemName) 
{ 
    $ControllerSvc = $SystemName 

    $query = "SELECT * FROM __InstanceModificationEvent WITHIN 2 " + 
      "WHERE TargetInstance Isa 'Win32_Service' " + 
      "AND TargetINstance.Name = '" + $ControllerSvc + "' " + 
      "AND TargetInstance.State = 'Stopped'" 

    $action = 
    { 
     Write-Host $Event.SourceEventArgs.NewEvent.TargetInstance.Name," stopped " 
     Unregister-Event -SourceIdentifier "ControllerSvcEvent"  
    } 

    Register-WMIEvent -query $query -SourceIdentifier "ControllerSvcEvent" -action $action 
} 

Stop-MyService 'MSSQL$SQLEXPRESS' 

我使用的SQL Server Express進行測試。

+0

謝謝。我有upvoted。很好的選擇。但是,由於我的問題對變量傳遞非常具體,我選擇了另一個答案作爲可接受的答案。 –