Cod*_*ggo 4 arrays powershell casting anonymous-function data-loss
我目前在 Powershell 中使用匿名函数,我注意到从System.ValueType到System.Object时存在奇怪的转换问题。
举个例子:
$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)
Run Code Online (Sandbox Code Playgroud)
以下示例将输出以下内容:
$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)
Run Code Online (Sandbox Code Playgroud)
新的更改产生以下输出:
$Arr 调用前类型:System.Object[]
$Arr 调用前内容:True False调用期间的 $Arr 类型:System.Object[]
$Arr 调用期间的内容:True
Powershell 仅提供匿名函数我的数组的一个元素。这里发生了什么?
boolean
当我明确给它一个数组时,为什么 Powershell 会强制转换为 a object
? 使用:
$f.Invoke((, $Arr))
Run Code Online (Sandbox Code Playgroud)
或者,更通俗地讲,PowerShell:
& $f $Arr
Run Code Online (Sandbox Code Playgroud)
至于你尝试过的:
$f.Invoke($Arr)
将数组的元素$Arr
作为单独的参数传递。由于您的脚本块$f
仅定义一个参数,因此只有 的第一个元素$Arr
绑定到该参数,$InputArray
。
(, ($Arr))
通过将数组包装在辅助单元素数组中来解决该问题,$f.Invoke()
然后该数组将展开并$Arr
作为单个参数传递。
也就是说,在 PowerShell 中使用对象方法通常是一种尴尬的体验,因为调用语法会导致与 PowerShell命令语法的混淆。
通常,可以停留在 PowerShell 命令和操作符的范围内。
具体来说,调用脚本块 ( ) 的 PowerShell 惯用方法{ ... }
是使用&
call 运算符(在子作用域中执行脚本块;或者.
,点源运算符(通常)直接在调用者的作用域中执行) 。
&
(和.
)使用命令语法(参数解析模式),其中参数在没有括号的情况下传递并用空格分隔,而不是,
- 请参阅此答案以获取更多信息。
因此,& $f $Arr
解释$Arr
为第一个也是唯一一个作为整体传递给脚本块的参数。
归档时间: |
|
查看次数: |
1062 次 |
最近记录: |