Powershell控制台问题,函数在Register-ObjectEvent的操作中执行

时间:2017-02-11 10:18:29

标签: powershell

在powershell ISE中运行良好,但在控制台中我得到:

  

术语“MainAction”未被识别为cmdlet的名称,   功能,脚本文件或可操作程序。检查拼写   名称,或者如果包含路径,请验证路径是否正确   再试一次。

如何解决?

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()

修改

我发现我可以使用配置文件来存储函数定义。要create profile使用:

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

但我仍然感兴趣的是为什么PowerShell ISE不需要配置文件来存储和使用Register-ObjectEvent中的函数。

1 个答案:

答案 0 :(得分:3)

当您向-Action注册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()