2013-10-22 114 views
0

我試圖在用戶鎖定計算機時執行腳本。這是我的腳本看起來像:無法從Powershell腳本調用腳本塊

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


$sysevent = [microsoft.win32.systemevents] 

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

的問題是,它不會在控制檯窗口中打印任何東西,但如果我在操作開關寫的代碼,它工作正常。

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

有沒有什麼我在調用$OnLock腳本塊時失蹤?

+1

當你從'-Action'參數調用'$ OnLock'時,移除大括號。 –

+0

你可以將它發佈爲答案,以便我可以接受它嗎? – Asdfg

回答

2

周圍$OnLock取下牙套,當你從-Action參數調用它。

1

事件操作在不能訪問本地變量的單獨運行空間中運行。嘗試使其成爲全球範圍內的一項功能。

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

$sysevent = [microsoft.win32.systemevents] 

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

我今天發現了一種有趣的方式,通過使用前面提到的MessageData參數傳遞給Register-ObjectEvent cmdlet的Action參數的腳本塊來調用腳本的本地函數,而不必將這些函數歸於全局範圍。看看下面的代碼片段:

&{ 
    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() 
    } 
    [email protected]{refr=5} 
    tmbeg 
    shincs 
}