管道传输到具有多个参数的 cmdlet

Piping to a cmdlet with multiple parameters

我有这个 cmdlet:(精简)

[CmdletBinding()]
Function Add-DatabaseUser()
{
    Param([string]$LogonName, [string]$UserName, [switch]$FullAccess)

    Write-Output($LogonName)
    Write-Output($UserName)
    Write-Output($FullAccess)
}

是否可以像这样将数组数组之类的东西通过管道传输到此 cmdlet:

$users = @(
    @('user1', 'user1', $true),
    @('user2', 'user2', $false),
    @('user3', 'user4', $true),
    @('user4', 'user4', $true)
)

$users | Add-DatabaseUser

而不是对 cmdlet 进行 4 次单独调用?

Add-DatabaseUser 'user1' 'user1' $true
Add-DatabaseUser 'user2' 'user2' $false
# etc.

更新:

我听从了 Richards 的建议并创建了一些东西来测试管道输入,但有些地方不对。下面的代码:(我已将 ValueFromPipelineByPropertyName = true 添加到 cmdlet 中的所有参数)

$users = @(
 @{LogonName='user1'; UserName='user1'; FullAccess=$false},
 @{LogonName='user2'; UserName='user2'; FullAccess=$false}
)

$users | Add-DatabaseUser

这给出了以下输出:

System.Collections.HashTable
System.Collections.HashTable
True
System.Collections.HashTable
System.Collections.HashTable
False

是的。

您需要为参数设置 ValueFromPipelineByPropertyName 值。

例如,来自about_Functions_Advanced_Parameters

Param
(
  [parameter(Mandatory=$true,
             ValueFromPipelineByPropertyName=$true)]
  [String[]]
  $ComputerName,
  …
)

根据该定义,$ComputerName 将从管道中对象上的那个名称的 属性 设置。 (它也会根据参数名称别名进行匹配。)