0

ユーザーがコンピュータをロックしたときにスクリプトを実行しようとしています。これは私のスクリプトがどのように見えるかです:

$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スクリプト ブロックの呼び出し中に不足しているものはありますか?

4

3 に答える 3

2

$OnLockパラメーターから呼び出すときは、中かっこを削除し-Actionます。

于 2013-10-22T18:37:02.553 に答える
1

イベント アクションは、ローカル変数にアクセスできない別の実行空間で実行されます。グローバルスコープの関数にしてみてください。

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

$sysevent = [microsoft.win32.systemevents]

Register-ObjectEvent -InputObject $sysevent -EventName "SessionSwitch" -Action {OnLock} -SourceIdentifier "ExecuteOnLock"
于 2013-10-22T16:16:28.890 に答える
0

私は本日、Register-ObjectEvent コマンドレットの Action パラメーターに渡されたスクリプト ブロックから、前述のコマンドレットの MessageData パラメーターを使用して、これらの関数をグローバル スコープに関連付けることなく、スクリプトのローカル関数を呼び出す面白い方法を発見しました。次のコード スニペットを見てください。

&{  
  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
}
于 2017-05-26T20:23:23.330 に答える