FilesystemWatcher事件函数Powershell内部的访问函数

时间:2018-09-02 06:24:29

标签: function powershell scope global-variables

我想访问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
} 

2 个答案:

答案 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。