在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
中的函数。
答案 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()