Просмотр вложенных частных определений функций в PowerShell - PullRequest
4 голосов
/ 21 февраля 2012

PowerShell предоставляет простой метод для просмотра содержимого функции, например,

Get-Content function:MyFuncName   # (A)

или эквивалентно

(Get-ChildItem function:MyFuncName).definition    # (B)

, где MyFuncName - это имя моегофункция.Это отлично подходит для простых функций (т. Е. Функций, которые используют только конструкции базового языка и не вызывают другие функции).Но рассмотрим функцию foo, показанную ниже, которая содержит вызов функции bar.В типичном сценарии они оба содержались бы в одном и том же модуле, публичный API которого состоит исключительно из функции foo и, таким образом, это единственная экспортируемая функция.

function foo ()
{
    $p = bar "here"
    "result is '$p'"
}
function bar ([string] $s)
{
    $s + $s
}
Export-ModuleMember foo

Есть ли способ просмотра вложенногонеэкспортированные функции (например, функция bar) внутри другой функции способом, сопоставимым с (A) или (B) выше?(То есть без открытия файла .psm1 в редакторе: -)

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Я не уверен, что вы можете сделать это для определенной функции в модуле, но вы можете сделать это для всего модуля:

Import-Module C:\Test.psm1
(Get-Module Test).Definition

Я думаю, что тот факт, что функция foo вызывает функциональную панель,неизвестно до времени выполнения.

Обновление

Там, где есть желание, есть способ :-) Вот как вы можете получить доступ к закрытым членам модуля.Вызовите модуль с помощью блока скриптов.Внутри блока скриптов видны приватные участники.

Import-Module C:\Test.psm1
$module = Get-Module Test
& $module { (get-item function:bar).Definition }

Благодаря PowerTips :-) http://powershell.com/cs/blogs/tips/archive/2009/09/18/accessing-hidden-module-members.aspx

Обновление 2

После нахождениямаленький фрагмент PowerTip Мне было любопытно, что на самом деле происходит ... Во фрагменте используется оператор вызова & с двумя аргументами.

  1. Объект модуля (System.Management.Automation.PSModuleInfo)
  2. Блок сценария

Так что в действительности происходит вызов метода Invoke типа PSModuleInfo.Код в блоке сценария выполняется в том же состоянии сеанса, что и остальная часть кода модуля, поэтому он имеет доступ к закрытым членам.Этот код делает то же самое, что и фрагмент PowerTip:

$module = Get-Module Test
$module.Invoke( { (get-item function:bar).Definition } )

Проверьте метод вызова здесь: http://msdn.microsoft.com/en-us/library/system.management.automation.psmoduleinfo.invoke(v=vs.85).aspx

0 голосов
/ 21 февраля 2012

Нет. Метод, который вы используете, получает определение функции через поставщика функций в локальной области видимости. Он будет видеть только функции, определенные в локальной области или видимые в родительских областях.

Когда вы вызываете функцию, она запускается в своей области видимости. Любые функции, которые создает функция, будут созданы в этой дочерней области и будут существовать только во время выполнения этой функции. Когда функция завершена, область действия, которую она выполняла, удаляется, и все созданные ею функции идут вместе с ней.

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