我想访问filesystemwatcher创建的事件函数内的函数。我尝试使用全局函数,但在控制台上从未看到输出。
#Script Parameters
param(
[Parameter(Mandatory=$True, position=1)]
[String]$path
)
#Global Function
function global:myFunction (){
Write-Host "myFunction"
}
#FileSystemWatcher properties
$fsw = New-Object System.IO.FileSystemWatcher
$fsw.Path = $path
$fsw.Filter = ""
$fsw.IncludeSubDirectories = $True
$fsw.EnableRaisingEvents = $True
#Created event function
Register-ObjectEvent -InputObject $fsw -EventName Created -Action{
$global:myFunction #trying to access global function
}
答案 0 :(得分:0)
您可以在Action脚本块中明确指定函数。像这样
#FileSystemWatcher properties
$fsw = New-Object System.IO.FileSystemWatcher
$fsw.Path = $path
$fsw.Filter = ""
$fsw.IncludeSubDirectories = $True
$fsw.EnableRaisingEvents = $True
#Created event function
Register-ObjectEvent -InputObject $fsw -EventName Created -Action {
#Describe your function here
function global:myFunction (){
Write-Host "myFunction"
}
#There call your function
global:myFunction
}
答案 1 :(得分:0)
您唯一的问题是有关如何调用全局函数的语法混乱:
$global:myFunction # WRONG - looks for *variable*
在全局范围内寻找名为myFunction
的变量。
省略$
来调用函数:
global:myFunction # OK - calls function
也就是说,假设给定会话中的所有范围默认情况下都可以查看全局定义,您不需要global:
范围说明符-只需调用myFunction
:< / p>
global:
的情况是,当前范围内或祖先范围内是否存在不同 myFunction
定义,并且您想显式定位全局对象定义。global:
,那么这样的不同定义将 shadow (隐藏)全局定义。将它们放在一起:
# Script Parameters
param(
[Parameter(Mandatory=$True, position=1)]
[String]$path
)
# Global Function
function global:myFunction {
param($FullName)
Write-Host "File created: $FullName"
}
# FileSystemWatcher properties
$fsw = New-Object System.IO.FileSystemWatcher
$fsw.Path = $path
$fsw.Filter = ""
$fsw.IncludeSubDirectories = $True
$fsw.EnableRaisingEvents = $True
# Created-event function
$eventJob = Register-ObjectEvent -InputObject $fsw -EventName Created -Action {
myFunction $EventArgs.FullPath # Call the global function.
}
请注意,我已经扩展了代码,以通过自动myFunction
变量将新创建的文件的完整文件名传递到$EventArgs
。
替代:
通过脚本修改全局作用域可能会出现问题,这可能会导致名称冲突,尤其是因为即使脚本终止后,全局定义仍然存在。
因此,请考虑:
二者之一:将功能myFunction
的代码直接移到-Action
脚本块中。
或:从-Action
脚本块中调用(可能是临时的)脚本文件。
还要注意,事件操作块通常将输出写到成功输出流,而不是直接用Write-Host
写到主机-如果它们根本需要产生输出,则可以在其中通过{{ 1}} cmdlet。