Вызов локальной функции из файла с точечным источником - PullRequest
0 голосов
/ 27 октября 2011

У меня есть основной скрипт, который я запускаю.Что он делает, так это читает каталог, заполненный другими сценариями PowerShell, точка включает их все и запускает предопределенный метод в каждой части, состоящей из первой части имени файла с разделителями точками.Пример:

  1. Выполнить master.ps1
  2. Точечные источники Master.ps1. \ Resource \ sub.ps1
  3. Sub.ps1 определил функцию с именем 'dosub'
  4. Master.ps1 запускает 'dosub', используя выражение-выражение

Также в sub.ps1 определена функция 'sayomething'.В 'dosub' реализован вызов 'sayomething'.

Моя проблема в том, что я все время получаю сообщение об ошибке:

Термин "sayomething" не распознается как имя командлета, функции, файла сценария или работоспособной программы.Проверьте правильность написания имени или, если путь был указан, убедитесь, что путь правильный и попробуйте снова.

Почему метод dosub не может найти метод sayomething, которыйопределен в том же файле?

master.ps1:

$handlersDir = "handlers"

$handlers = @(Get-ChildItem $handlersDir)

foreach ( $handler in $handlers ) {

    . .\$handlersDir\$handler

    $fnParts = $handler.Name.split(".")

    $exp = "do" + $fnParts[0]
    Invoke-Expression $exp
}

sub.ps1:

function saysomething() {
    Write-Host "I'm here to say something!"
}


function dosub() {
    saysomething
    Write-Host "In dosub!"
}

Ответы [ 2 ]

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

То, что вы дали, работает по мере необходимости.Вероятно, у вас нет каталогов и т. Д. На вашей машине.Или вы запускаете что-то еще и публикуете здесь другой (работающий!) Код.

Вы также можете внести следующие исправления:

. .\$handlersDir\$handler

вместо того, что указано выше:1007 *

Вместо разделения имени файла вы можете сделать:

$exp = "do" + $handler.basename
0 голосов
/ 27 октября 2011

Ваш код работает в моей системе.Однако вы можете немного упростить это:

$handlersDir = "handlers"

$handlers = @(Get-ChildItem $handlersDir)
foreach ( $handler in $handlers ) 
{
    . .\$handlersDir\$handler

    $exp = "do" + $handler.BaseName
    Write-Host "Calling $exp"
    & $exp
}

Обратите внимание на наличие свойства BaseName.Вам также не нужно использовать Invoke-Expression.Вы можете просто вызвать именованную команду, используя оператор вызова (&).

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