Ваша единственная проблема - это синтаксическая путаница о том, как вызывать глобальную функцию:
$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
.
Альтернативы
Изменение глобальной области видимости из скрипта может быть проблематичным из-за возможной коллизии имен, не в последнюю очередь потому, что глобальные определения задерживаются даже после завершения скрипта.
Поэтому рассмотрим:
Также обратите внимание, что блоки действия события обычно записывают вывод в поток вывода успеха, а не напрямую на хост с Write-Host
- если им вообще нужен вывод - где он может быть собран по требованию с помощью командлета Receive-Job
.