我正在尝试在用户锁定计算机时执行脚本。这就是我的脚本的样子:
$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
脚本块时是否有一些我遗漏的东西?
答案 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
}