Register-WmiEvent(Win32_ProcessStopTrace) - 如何在-Action开关中使用变量?

时间:2012-10-16 14:24:30

标签: powershell powershell-v2.0

我有以下功能,我注册了停止服务事件。 服务停止后,我想在事件中显示该ServiceName。但是,不知何故,下面的代码不想打印服务名称?

请参阅-Action开关中的Write-Host $ControllerSvc,” stopped ” 打印justs“已停止”。但是,如果我将代码更改为,这很好 -

Write-Host $e.ProcessName,” stopped ” (我不想要,因为我的进程或图片名称对于所有服务都是相同的。它类似于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 :为了简单起见,我在这里展示了一项服务。其实   有多个服务停止其中一个停止   其他。所以,我想显示正在获取的服务名称   在活动中停了下来。

2 个答案:

答案 0 :(得分: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进行测试。

答案 1 :(得分:0)

尝试传递$ControllerSvc-MessageData的{​​{1}}参数,然后根据this article可以通过Register-WMIEvent访问它。