powershell - ScriptProperty 在作为命令调用时无法访问脚本的 cmdlet
问题描述
给定诸如此 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 无法访问脚本本身中定义的 cmdlet/函数;虽然可以访问标准的(例如Get-Date
)。
我认为这是一个错误;PWSH 和 PowerShell 中只有相同的行为;这使得这种可能性降低了一点。
这是一个错误吗?或者我在我的理解中遗漏了什么。
解决方案
-File
行为上的差异可以通过隐式点源目标脚本文件这一事实来解释,这意味着它在全局范围内运行。
通常,此详细信息无关紧要(除非您-NoExit
在脚本终止后还传递请求留在会话中)。
在这里,它产生了关键的区别:
-File
,Get-One
最终定义在全局范围ScriptProperty
内,这是-defining{ Get-One }
脚本块能够看到它的先决条件。相比之下,运行脚本文件
-Command
并不会对其进行点源,从而使Get-One
命令实际上对{ Get-One }
脚本块不可见-并且在此类ScriptProperty
定义的脚本块中发生的错误被悄悄地忽略了。
有两种解决方案:
Get-One
要么:将您的函数明确定义为global:function global:Get-One { 1 }
或者:使用 时
-Command
,明确点源脚本:pwsh -Command '. .\Demo.ps1'
推荐阅读
- mysql - 如何在 mysql 5.7 中完全禁用 GTID?
- json - 如何按字段名在json文件中迭代
- javascript - 按空格键不会切换视频播放或暂停
- r - 我可以根据 R 中的位置拆分字符向量吗?
- azure-devops - 是否可以通过 api 获取提交更改(仅限差异)?
- android - Android处理触摸事件并将它们传递给孩子或另一个视图来处理
- google-chrome - 有没有办法使用 Google Auth 自定义 403 消息?
- android - 未处理的异常:MissingPluginException(在通道 plugins.flutter.io/share 上找不到方法共享的实现)
- mysql - 将数据库连接功能与查询功能分开
- javascript - Expess 中的 UnhandledPromiseRejectionWarning 错误