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 中似乎只有相同的行为;这使得这种可能性小一点。
这是一个错误吗?或者我在理解中遗漏了什么。
行为上的差异是通过-File隐式点源目标脚本文件的事实来解释的,这意味着它在全局范围内运行。
通常,这个细节没有什么影响(除非你-NoExit在脚本终止后还传递到请求保持在会话中)。
在这里,它产生了关键的区别:
随着-File,Get-One结束了在定义全球范围内,这对于前提ScriptProperty-定义{ Get-One }脚本块能看到它。
相比之下,运行脚本文件-Command并不会点源它,这使得该Get-One命令实际上对{ Get-One }脚本块不可见- 并且在此类ScriptProperty定义脚本块中发生的错误会被悄悄忽略。
有两种解决方案:
要么:将您的Get-One函数明确定义为global:
function global:Get-One { 1 }
Run Code Online (Sandbox Code Playgroud)
或者:使用时-Command,显式点源脚本:
pwsh -Command '. .\Demo.ps1'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |