2015-10-04 123 views
0

我有此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. 

更新:

我已經按照理查茲的建議創建了一些測試管道輸入,但事情是不對的。下面的代碼:(我已經添加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 

回答

4

是。

您需要設置參數的ValueFromPipelineByPropertyName值。

例如,來自about_Functions_Advanced_Parameters

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

隨着這一定義,$ComputerName將從該名稱的在管道中的對象上的屬性來設置。 (它也將根據參數名稱別名進行匹配。)

+0

因此,在這種情況下,我必須使用散列數組而不是數組數組嗎? – Jake

+1

@Jake:是的,你需要這樣做。你可以設置一個參數來接受一個數組,但是對於調用者或者被調用者來說這個不太清楚。 – Richard

+0

我會試試看。我會在10分鐘內更新它。 – Jake