无法从Powershell脚本调用脚本块

时间:2013-10-22 15:43:40

标签: powershell

我正在尝试在用户锁定计算机时执行脚本。这就是我的脚本的样子:

$OnLock = 
{
    Write-Host  -ForeGround Green "System Locked"
}


$sysevent = [microsoft.win32.systemevents]

Register-ObjectEvent -InputObject $sysevent -EventName "SessionSwitch" -Action {$OnLock} -SourceIdentifier "ExecuteOnLock"

问题是它不会在控制台窗口上打印任何内容,但是如果我在Action开关中编写代码,它可以正常工作。

Register-ObjectEvent -InputObject $sysevent -EventName "SessionSwitch" -SourceIdentifier "ExecuteOnLock" -Action {Write-Host  -ForeGround Green "System Locked"} 

调用$OnLock脚本块时是否有一些我遗漏的东西?

3 个答案:

答案 0 :(得分:2)

$OnLock参数调用-Action后,删除{{1}}周围的大括号。

答案 1 :(得分:1)

事件操作在无法访问局部变量的单独运行空间中运行。尝试将其作为全局范围内的函数。

Function Global:OnLock { 
Write-Host  -ForeGround Green "System Locked" }

$sysevent = [microsoft.win32.systemevents]

Register-ObjectEvent -InputObject $sysevent -EventName "SessionSwitch" -Action {OnLock} -SourceIdentifier "ExecuteOnLock"

答案 2 :(得分:0)

我今天发现了一种有趣的方法,通过使用前面提到的cmdlet的MessageData参数从Register-ObjectEvent cmdlet的Action参数中传递的scriptblock调用脚本的本地函数,而不将这些函数归因于全局范围。请查看下一个代码段:

&{  
  function sesbeg{
    'Lots of usfull actions in the "sesbeg" function'
  }
  function rqincs{
    'Lots of usfull actions in the "rqincs" function'
  }
  function sesfin{
    'Lots of usfull actions in the "sesfin" function'
  }
  function outincs{
    'Lots of usfull actions in the "outincs" function'
  }
  function shincs{
    sesbeg
    $my.incs=rqincs
    sesfin
    if($my.incs){$my.incs;outincs;$refr=$my.refr*1000}
    else{write-host 'The data was not received';$refr=1000}
    $my.tim.Interval=$refr
  }
  function tmbeg{
    $my.tim=New-Object System.Timers.Timer ($my.refr*1000)
    $my.tim.AutoReset=$True
    $my.subs=Register-ObjectEvent $my.tim Elapsed `
               -Action {$Event.MessageData|%{$my=$_.my;&$_.fn}|Out-Host} `
               -MessageData @{my=$my;fn=$function:shincs}
    $my.tim.Start()
  }
  $my=@{refr=5}
  tmbeg
  shincs
}