Функция доступа внутри функции событий filesystemwatcher powershell - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу получить доступ к функции внутри созданной функции событий 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 голосов
/ 03 сентября 2018

Ваша единственная проблема - это синтаксическая путаница о том, как вызывать глобальную функцию:

$global:myFunction # WRONG - looks for *variable*

ищет переменную с именем myFunction в глобальной области видимости.

Пропустить $ для вызова функции :

global:myFunction # OK - calls function

Тем не менее, учитывая, что все области в данном сеансе по умолчанию видят глобальные определения, вам не нужен спецификатор области global: - просто вызовите myFunction:

  • Единственное время, когда вам нужно 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 - если им вообще нужен вывод - где он может быть собран по требованию с помощью командлета Receive-Job .

0 голосов
/ 02 сентября 2018

Вы можете явно указать свою функцию в блоке сценария 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
}
...