我在下面有这个脚本,不知何故无法通过这个匿名调用函数.我需要调用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)
事件被捕获,写主机写得很好,但没有调用测试功能.
从"匿名者"(称为脚本块)调用函数并不是一个问题.
这里发生的事情是,当您指定一个动作时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)
| 归档时间: |
|
| 查看次数: |
1587 次 |
| 最近记录: |