似乎调用Powershell脚本块(通过调用.Invoke()
方法)总是产生一个集合。具体地,类型为什么使用.Invoke()调用Powershell脚本块会返回一个集合?
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]
即使调用一个空脚本块({}.Invoke()
)的集合返回一个集合。使用调用操作员调用相同的脚本块(&
)会生成正常预期的回报(标量或[object[]]
)。
如果你需要一个集合而不是一个数组,它会变得很方便,但它看起来有点违反直觉。
有谁知道它为什么这样表现?
编辑:
我知道有两个不同的调用,.Invoke()
和.InvokeReturnAsIs()
从阅读的语言规范。那是我第一次注意到它。
我只是不明白命名约定背后的原因和它的机制似乎工作的方式。看看文档,我会想到的是默认的调用方法不是当在Powershell中调用脚本块时使用的方法。看起来,.InvokeReturnAsIs()
只是返回一个对象流,然后如果有多个对象,则Powershell将其包装到对象数组中,如果只有一个对象,则将它包装到对象数组中,或者创建空对象(如果没有对象),就好像存在隐式管道在那里。总是使用.Invoke()
返回一个集合,Powershell将其作为集合保留。
我得到了这样的想法,当我这样做时,它会收集:({} .invoke).gettype() – mjolinor 2012-01-27 11:16:39
'Get-Member -InputObject({} .invoke())'也表明它也是返回一个集合;相反,'$ null -eq {} .Invoke()'返回'$ False'。返回的集合是_empty_,这就是为什么它在控制台中不产生输出。 – mklement0 2017-06-21 22:09:26