如何从匿名中调用函数?

Zul*_*u Z 4 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 
Run Code Online (Sandbox Code Playgroud)

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

man*_*lds 7

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

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

如果您确实这样做Get-Job并看到了这份工作,您会发现它失败了.最简单的解决方案是内联代码.或者在会话中使用函数,通过使用global范围定义它:

function global:test
{
    Write-Host "send email" 
}
Run Code Online (Sandbox Code Playgroud)

或者只是在您的控制台中手动定义它或将其添加到您的配置文件中.

或者,您可以将该函数添加到脚本中,例如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
}
Run Code Online (Sandbox Code Playgroud)