2017-02-11 7 views
1

作品罰金のアクションで実行する機能を持つPowerShellコンソールを発行しますが、コンソールに私が取得:のPowerShell ISEで登録-ObjectEvent

用語「MainAction」はコマンドレットの名前として認識されない、 機能、スクリプトファイル、または実行可能なプログラム。 の名前のスペルを確認するか、パスが含まれている場合は、パスが正しいことを確認してから、 を再試行してください。

修正方法?

function MainAction() { 
    $test = "123" 
    Write-Host $test 
} 

MainAction 

$action = { 
    try { 
     Write-Host in action 
     MainAction 
    } catch { 
     Write-Host $Error  
     $timer.Stop() 
     Unregister-Event thetimer 
    } 
} 

$timer = New-Object Timers.Timer  
Register-ObjectEvent -InputObject $timer -EventName elapsed ` 
        -SourceIdentifier thetimer -Action $action -OutVariable out 
$timer.Interval = 5000 
$timer.AutoReset = $true 
$timer.Start() 

EDIT:

私は、関数定義を保存するためにプロファイルを使用することができますことを見出しました。 create profile使用するには:

New-Item -path $profile -itemType file -force 

しかしI'amまだintrestedて理由のPowerShell ISE Register-ObjectEventの作用で機能を保存し、使用するプロファイルを必要としません。

+1

'関数MainAction' - >'関数グローバル: MainAction' – PetSerAl

+0

あなたは正しく、これはプロフィールよりも便利で、ありがとうございます。 – Lavandil

答えて

3

Register-ObjectEventに登録すると、PowerShellはアクションをホストする新しい動的モジュールを作成します。したがって、結果として、イベントハンドラと残りのコードとの間でグローバルスコープのみが共有されます。だから、あなたはグローバルスコープ内のすべての必要な機能を置く必要があります。

function global:MainAction { 
    Write-Host 'Do something' 
} 

$Action = { MainAction } 

$Timer = New-Object Timers.Timer 
$EventJob = Register-ObjectEvent -InputObject $Timer -EventName Elapsed -Action $Action 

$Timer.Interval = 5000 
$Timer.AutoReset = $true 
$Timer.Start() 

または明示的にPowerShellのことで作成した動的モジュールの範囲でそれらを追加します。

$Action = { MainAction } 

$Timer = New-Object Timers.Timer 
$EventJob = Register-ObjectEvent -InputObject $Timer -EventName Elapsed -Action $Action 

. $EventJob.Module { 
    function MainAction { 
     Write-Host 'Do something' 
    } 
} 

$Timer.Interval = 5000 
$Timer.AutoReset = $true 
$Timer.Start() 
+0

また、メインスレッドからもアクセス可能でなければならない場合、動的モジュールを使用して関数と変数を保存することができます。 – Lavandil

関連する問題