如何从匿名中调用函数?

时间:2011-10-26 19:44:35

标签: powershell

我在下面有这个脚本,不知何故无法通过这个匿名调用函数。 我需要调用mail函数来发送关于此事件的通知。

function test
{
    Write-Host "send email" 
}

$action = {
    $path = $Event.SourceEventArgs.FullPath
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated
    Write-Host "The file '$name' was $changeType at $timeStamp" 
    test
    }

  $folder = 'C:\temp'
    $filter = '*.*'                             
    $fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
    IncludeSubdirectories = $true        
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
    $onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -  Action         $action 

事件被捕获,写主机写得很好,但没有调用测试功能。

2 个答案:

答案 0 :(得分:7)

从“匿名者”(称为脚本块)调用函数并不是一个问题。

这里发生的事情是,当您为Register-ObjectEvent指定一个动作时,它会设置一个作业并将该动作作为该作业的命令发送。当事件发生并且作业运行时,它不知道测试功能是什么。

如果您实际执行Get-Job并查看作业,您会发现它已失败。最简单的解决方案是内联代码。或者在会话中使用global范围:

定义函数
function global:test
{
    Write-Host "send email" 
}

或手动将其定义在您的控制台中或将其添加到您的个人资料中。

或者,您可以将该功能添加到脚本中,例如test.ps1,在$action - . path\to\test.ps1中点源,然后拨打test

$action = {
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file '$name' was $changeType at $timeStamp"
. c:\test.ps1
test
}

答案 1 :(得分:0)

这是一个范围问题。触发事件后,脚本不再在范围内,因此无法看到函数test。有两种方法可以解决这个问题:

  1. 将测试放在全球范围内:

    功能全局:测试 {     写主机“发送电子邮件” }

  2. Dot-Source脚本,以便将测试注入到父作用域中:

    。 \ yourScript.ps1