Dav*_*ard 3 parameters powershell function
在 PowerShell 中,我有一组需要传递给函数的对象。该函数是然后循环遍历数组中的所有对象,但它似乎没有正确接受参数值。
以下面的例子为例,我传递了一个包含两个对象的数组。我希望数组的计数在函数之前和函数内都是 2,但是一旦它碰到函数,计数就是 1,而我的输入并不像预期的那样;只发现最后一个对象。
我在这里遗漏了什么,还是 PowerShell 中的错误?
### I've also tries '[object]', '[array]' and '[array[]]' as the type for '$testArr'.
function Test-PassArrayOfObjects
{
param(
[parameter(Mandatory,ValueFromPipeline)]
[object[]]$testArr
)
Write-Host "In function count: $($testArr.Count)"
$testArr | ForEach-Object { $_ }
}
$test1 = New-Object –TypeName PSObject
$test1 | Add-Member -MemberType NoteProperty -Name Test1 -Value Value1
$test2 = New-Object –TypeName PSObject
$test2 | Add-Member -MemberType NoteProperty -Name Test2 -Value Value2
$testArr = @($test1, $test2)
$testArr.GetType() | Format-Table
Write-Host "Before function count: $($testArr.Count)"
$testArr | Test-PassArrayOfObjects
Run Code Online (Sandbox Code Playgroud)
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
Before function count: 2
In function count: 1
Test2
-----
Value2
Run Code Online (Sandbox Code Playgroud)
根据下面的答案,我有这个工作示例,我已经能够将其应用于我的现实生活场景。
function Test-PassArrayOfObjects
{
param(
[parameter(Mandatory,ValueFromPipeline)]
[object]$testArr
)
Process {
Write-Host "In function count: $($testArr.Count)"
$testArr
}
}
$test1 = New-Object –TypeName PSObject
$test1 | Add-Member -MemberType NoteProperty -Name Test1 -Value Value1
$test1 | Add-Member -MemberType NoteProperty -Name Test2 -Value Value2
$test2 = New-Object –TypeName PSObject
$test2 | Add-Member -MemberType NoteProperty -Name Test1 -Value Value1
$test2 | Add-Member -MemberType NoteProperty -Name Test2 -Value Value2
$testArr = @($test1, $test2)
$testArr.GetType() | Format-Table
Write-Host "Before function count: $($testArr.Count)"
$testArr | ForEach-Object { $_ | Test-PassArrayOfObjects }
Run Code Online (Sandbox Code Playgroud)
通过管道向函数发送输入时,您的函数应包含一个Process块:
function Test-PassArrayOfObjects
{
param(
[parameter(Mandatory,ValueFromPipeline)]
[object[]]$testArr
)
Process {
Write-Host "In function count: $($testArr.Count)"
$testArr | ForEach-Object { $_ }
}
}
Run Code Online (Sandbox Code Playgroud)
这是必要的,因为我相信管道处理集合的方式。它会自动展开它们并一次处理一个项目,因此您ForEach-Object不会在$testArr变量中获取整个集合。
你经常看到这样的函数仍然包含一个ForEach虽然,如果输入是通过参数发送的,在这种情况下它会被一次性接收。例如:Test-PassArrayOfObjects -TestArr @(1,2,3)。
您的问题因数组具有两个具有不同属性的对象而进一步混淆。这会在输出中造成混淆,因为 PowerShell 决定如何根据第一个对象格式化输出,并在输出第二个对象时使用相同的格式,但随后您看不到它,因为它不共享任何相同的对象属性(我认为这就是正在发生的事情......)。
你可以看到,这两个对象获得通过将处理过| Format-List的$_哪支部队两个输出可以独立格式化为列表输出。请注意,这在实际功能场景中当然不是好的做法。另一种方法是在两个对象上都使用属性名称Test1。然后您将看到您可能不使用Format-List.
| 归档时间: |
|
| 查看次数: |
5440 次 |
| 最近记录: |