2010-05-21 17 views
1

J'ai un script Powershell qui lit les valeurs hors du pipeline:liste de valeurs par défaut pour le pipeline param dans Powershell

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s 
) 

PROCESS { 
    echo "* $s" 
} 

fonctionne très bien:

PS> my.ps1 Foo
* foo

Je voudrais que le script ait une liste de valeurs par défaut, car l'utilisation la plus courante utilisera toujours les mêmes valeurs et le stockage em dans le défaut sera le plus pratique. Je l'ai fait la mission habituelle:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s = 'bar' 
) 

PROCESS { 
    echo "* $s" 
} 

Encore une fois, fonctionne très bien:

PS> my.ps1
* bar
PS> my.ps1 foo
* foo

Cependant, lorsque la valeur par défaut est une liste, je récupère quelque chose de tout à fait raisonnable mais pas du tout ce que je veux:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s = @('bar', 'bat', 'boy') 
) 

PROCESS { 
    echo "* $s" 
} 

Résultat:

PS> my.ps1
* chauve-souris bar garçon

Je me attendais:

PS> my.ps1
* bar
* bat
* garçon

Comment puis-je obtenir un appel dans la boucle Process pour chaque valeur par défaut? (Ceci est quelque peu différent de l'appel à Process et de l'encapsulation du corps actuel dans une grande boucle foreach sur $ s).

Répondre

6

Il est worky que vous attendez comme indiqué plus explicitement par ce changement à votre code:

PARAM ( 
    [Parameter(ValueFromPipeline = $true)] 
    $s = @('bar', 'bat', 'boy') 
) 

PROCESS { 
    $s | %{$_ + " is a " + $_.GetType().Name} 
} 

ce que vous obtenez confus par est une caractéristique de PowerShell où il aplatit les tableaux lorsqu'on lui a demandé de les rendre à une chaîne de caractères, par exemple:

PS> $arr = 1,2,3 
PS> "$arr" 
1, 2, 3 
PS> $OFS = ', ' 
PS> "$arr" 
1, 2, 3 

Par défaut, PowerShell affiche chaque élément de réseau un après l'autre à l'aide d'un séparateur d'espace. Vous pouvez remplacer le séparateur par défaut par n'importe quelle chaîne en définissant la variable de séparateur de champ de sortie $OFS.

+0

Tirez. J'espérais ne pas avoir à faire une foreach sur chaque objet entrant. Je vous remercie. –

+2

En général, vous devez pouvoir comptabiliser les collections et pas seulement les scalaires pour votre paramètre pipelinebound (by value). Le modèle standard est quelque chose comme 'Process {foreach ($ obj dans $ pipelineParam) {...}}' –

+0

Cela ressemble à un conseil solide. Je vous remercie. –

-1

Plutôt que:

PROCESS { 
    echo "* $s" 
} 

faire:

PROCESS { 
    $s | foreach-object { 
     "* $_" 
    } 
} 

et essayer de sortir de l'habitude d'utiliser l'écho (écriture sortie) que tout ne sera capturé sortie pour vous.

+1

J'ai besoin d'un appel en cours par objet du pipeline. C'est ce que je voulais dire par la déclaration entre parenthèses à la fin. Thx cependant. –