ScriptProperty не может получить доступ к командлетам скрипта при вызове в виде команды

Данный код, такой как этот MRE:

      function Get-One {1}
Update-TypeData -TypeName 'Demo' -MemberType 'ScriptProperty' -MemberName 'Test1' -Value {Get-Date}
Update-TypeData -TypeName 'Demo' -MemberType 'ScriptProperty' -MemberName 'Test2' -Value {Get-One}
$example = [PSCustomObject]@{PSTypeName = 'Demo'}
$example

Если я назову его как pwsh -File '.\Demo.ps1' тогда все работает, как и следовало ожидать / я получаю такой результат:

      Test1               Test2
-----               -----
2021-04-17 21:35:55     1

Однако, если я вызову ту же команду, что и pwsh -Command '.\Demo.ps1'Я получаю это (т.е. Test2 пуст); в то время как я ожидал бы получить то же самое, что и выше:

      Test1               Test2
-----               -----
2021-04-17 21:35:55     

т.е. когда я вызываю через -Commandпараметр, ScriptProperty не может получить доступ к командлетам / функциям, определенным в самом скрипте; хотя может получить доступ к стандартным (например, Get-Date).

Я бы предположил, что это ошибка; только одно и то же поведение кажется и в PWSH, и в PowerShell; что делает это немного менее вероятным.

Это ошибка? или я что-то упускаю в своем понимании.

1 ответ

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

Как правило, эта деталь не имеет большого значения (кроме случаев, когда вы также пропускаете -NoExit для запроса о продолжении сеанса после завершения сценария).

Здесь есть решающая разница:

  • С участием -File, заканчивается определением в глобальной области видимости, что является предварительным условием для того, чтобы блок сценария -defining мог его увидеть .

  • Напротив, при запуске файла сценария с его источником не точка, что делает команду фактически невидимой для пользователя. { Get-One } блок скрипта - и ошибки, возникающие внутри таких ScriptProperty-определение блоков скрипта незаметно игнорируется .

Есть два решения :

  • Либо: четко определите свой Get-Oneфункционировать как глобальный :

            function global:Get-One { 1 }
    
  • Или: при использовании -Command, явно укажите источник скрипта:

             pwsh -Command '. .\Demo.ps1'
    
Другие вопросы по тегам