我目前在 Powershell 中使用匿名函数,我注意到在从系统值类型 to 系统对象.
举个例子:
$f = {
param($InputArray)
Write-Host "`$Arr Type During Call:" ($InputArray.GetType().FullName)
Write-Host "`$Arr Contents During Call:" $InputArray
}
[object[]]$Arr = [object[]]@($true, $false)
Write-Host "`$Arr Type Before Call:" ($Arr.GetType().FullName)
Write-Host "`$Arr Contents Before Call:" $Arr "`n"
$f.Invoke($Arr)
以下示例将输出以下内容:
$Arr 调用前类型:System.Object[]
$Arr 调用前的内容: True False
调用期间的 $Arr 类型:System.Boolean
通话期间的 $Arr 内容:True
看起来 Powershell 转换了我的变量$Arr
进入类型System.Boolean
。如果我强制参数的类型object[]
,引入一个新问题:
$f = {
param([object[]]$InputArray)
Write-Host "`$Arr Type During Call:" ($InputArray.GetType().FullName)
Write-Host "`$Arr Contents During Call:" $InputArray
}
[object[]]$Arr = [object[]]@($true, $false)
Write-Host "`$Arr Type Before Call:" ($Arr.GetType().FullName)
Write-Host "`$Arr Contents Before Call:" $Arr "`n"
$f.Invoke($Arr)
新的更改产生以下输出:
$Arr 调用前类型:System.Object[]
$Arr 调用前的内容: True False
调用期间的 $Arr 类型:System.Object[]
通话期间的 $Arr 内容:True
Powershell 仅提供匿名函数我的数组的一个元素。这里发生了什么?
-
为什么 Powershell 会强制转换为
boolean
当我明确地给它一个object
array?
- 即使我强制匿名函数的输入参数类型,为什么Powershell不提供整个数组?
Use:
$f.Invoke((, $Arr))
或者,更通俗地讲,PowerShell:
& $f $Arr
As for 你尝试过什么:
$f.Invoke($Arr)
传递数组的元素$Arr
as 个别论点。
由于您的脚本块$f
仅定义one参数,仅first的元素$Arr
绑定到该参数,$InputArray
.
(, ($Arr))
通过将数组包装在一个辅助的单元素数组,其中$f.Invoke()
然后打开并因此通过$Arr
as a single争论。
也就是说,使用对象methods在 PowerShell 中通常是一种尴尬的体验,因为调用语法会导致与 PowerShell 的混淆command syntax.
通常,可以停留在 PowerShell 命令和操作符的范围内。
具体来说,t调用脚本块的 PowerShell 惯用方式({ ... }
)是使用&
, 呼叫操作员(执行脚本块child scope; 或者.
, 点源运算符,(通常)执行直接在调用者的范围内).
&
(and .
) use command句法 (argument解析模式),其中参数在没有括号的情况下传递并用空白而不是,
- see 这个答案了解更多信息。
所以,& $f $Arr
解释$Arr
作为第一个也是唯一一个要传递的参数作为一个整体到脚本块。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)