Как вызвать функцию из анонимного? - PullRequest
4 голосов
/ 26 октября 2011

У меня есть этот скрипт ниже, и я не могу вызвать функцию из этого анонимного.Мне нужно вызвать функцию 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 

Событие перехвачено, write-host пишет нормально, но тестовая функция не вызывается.

Ответы [ 2 ]

7 голосов
/ 27 октября 2011

Это не совсем проблема вызова функции из «анонимной» (называемой блоком сценариев).

Здесь происходит следующее: когда вы указываете действие для Register-ObjectEvent, оно настраивает задание и отправляет действие в качестве команды для задания. Когда происходит событие и задание выполняется, оно не имеет ни малейшего представления о том, что представляет собой функция теста.

Если вы на самом деле выполните Get-Job и увидите задание, вы увидите, что оно провалилось. Самое простое решение - встроить код. Или используйте функцию в своем сеансе, определив ее с помощью global scope:

function global:test
{
    Write-Host "send email" 
}

или вручную, просто определив его в консоли или добавив в свой профиль.

В качестве альтернативы, вы можете добавить функцию в скрипт, скажем 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
}
0 голосов
/ 27 октября 2011

Это проблема объема. После запуска события сценарий больше не находится в области видимости и поэтому не может видеть функцию test. Есть 2 способа это исправить:

  1. Поместите тест в глобальную область:

    функция global: тест { Write-Host "отправить письмо" }

  2. Dot-Source скрипт, чтобы тест был внедрен в родительскую область:

    . . \ YourScript.ps1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...