作为命令调用时,ScriptProperty 无法访问脚本的 cmdlet

Joh*_*van 4 powershell powershell-core powershell-5.1

给定代码,例如此 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
Run Code Online (Sandbox Code Playgroud)

如果我调用它,pwsh -File '.\Demo.ps1'那么一切都会按您的预期工作/我得到以下输出:

Test1               Test2
-----               -----
2021-04-17 21:35:55     1
Run Code Online (Sandbox Code Playgroud)

但是,如果我调用相同的命令来pwsh -Command '.\Demo.ps1'获取此命令(即 Test2 为空白);虽然我希望得到与上述相同的结果:

Test1               Test2
-----               -----
2021-04-17 21:35:55     
Run Code Online (Sandbox Code Playgroud)

即当我通过-Command参数调用时,ScriptProperty 无法访问脚本本身定义的 cmdlet/函数;虽然可以访问标准的(例如Get-Date)。

我认为这是一个错误;在 PWSH 和 PowerShell 中似乎只有相同的行为;这使得这种可能性小一点。

这是一个错误吗?或者我在理解中遗漏了什么。

mkl*_*nt0 6

行为上的差异是通过-File隐式点源目标脚本文件的事实来解释的,这意味着它在全局范围内运行

通常,这个细节没有什么影响(除非你-NoExit在脚本终止后还传递到请求保持在会话中)。

在这里,它产生了关键的区别:

  • 随着-FileGet-One结束了在定义全球范围内,这对于前提ScriptProperty-定义{ Get-One }脚本块能看到它

  • 相比之下,运行脚本文件-Command不会点源它,这使得该Get-One命令实际上对{ Get-One }脚本块不可见- 并且在此类ScriptProperty定义脚本块中发生的错误会被悄悄忽略

有两种解决方案