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'