2015-10-04 1 views
0

J'ai cette applet de commande: (dépouillée)Piping à une applet de commande avec plusieurs paramètres

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

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

Est-il possible de tuyau quelque chose comme un tableau de tableaux à cette applet de commande comme ceci:

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

$users | Add-DatabaseUser 

Plutôt que de faire 4 appels individuels à l'applet de commande?

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

Mise à jour:

J'ai suivi des conseils Richards et a créé quelque chose pour tester l'entrée redirigée, mais quelque chose ne va pas. Code ci-dessous: (je l'ai ajouté ValueFromPipelineByPropertyName = true à tous les paramètres de l'applet de commande)

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

$users | Add-DatabaseUser 

Cela donne le résultat suivant:

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

Répondre

4

Oui.

Vous devez définir la valeur ValueFromPipelineByPropertyName pour le paramètre.

Par exemple, à partir about_Functions_Advanced_Parameters

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

Avec cette définition, $ComputerName sera mis d'une propriété de ce nom sur l'objet dans le pipeline. (Elle correspondra également en fonction des alias de nom de paramètre.)

+0

Alors devrais-je utiliser un tableau de hachages plutôt qu'un tableau de tableaux dans ce cas? – Jake

+1

@Jake: Oui, vous auriez besoin de faire cela. Vous pouvez configurer un paramètre pour accepter un tableau, mais cela sera moins clair pour l'appelant ou l'appelé. – Richard

+0

Je vais essayer. Je vais mettre à jour dans environ 10 minutes. – Jake