我在下面有这个脚本,不知何故无法通过这个匿名调用函数。 我需要调用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
事件被捕获,写主机写得很好,但没有调用测试功能。
答案 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
。有两种方法可以解决这个问题:
将测试放在全球范围内:
功能全局:测试 { 写主机“发送电子邮件” }
Dot-Source脚本,以便将测试注入到父作用域中:
。 \ yourScript.ps1