J'essaie d'écrire une fonction PowerShell qui prend un argument de tableau. Je veux que cela soit appelé avec le tableau soit comme un argument, soit en tant qu'entrée de pipeline. Ainsi, appelant ressemble à quelque chose comme ceci:
PS> 1,2,3,4 | ./args PS> get-content args.ps1 param([string[]]$args) if ($null -eq $args) { $args = @($input) } $args -join ':'
4 Réponses :
Utilisez la variable automatique Si seule entrée de pipeline est attendue alors: p> mais j'utilise souvent cette approche combinée (Une fonction qui accepte les entrées à la fois sous forme d'argument ou via un pipeline): p> $ entrée code>.
Voici un autre exemple en utilisant PowerShell 2.0+
Cet exemple est si le paramètre n'est pas requis: P>
function my-function { [cmdletbinding()] Param( [Parameter(Mandatory=$true,ValueFromPipeline=$True)] [string[]]$Names ) End { # Verify pipe by Counting input $list = @($input) if($list.Count) { $Names = $list } $Names -join ':' } }
Vous devriez utiliser le pipeline (valeurfrommeline) car PowerShell est spécialement conçu pour cela. P> Tout d'abord, Il n'y a pas de vraie différence entre: Le point est que le point Nom du paramètre La cmdlet supposée de votre question n'est pas un très bon exemple car il ne se soucie que de l'entrée et d'une seule sortie que j'ai créée. Un autre exemple: p> Il crée essentiellement des objets personnalisés dans une liste de noms ( (il itère via tous les noms dans et cela se produit lorsque vous fournissez les noms $ args h2>
My-Fonction -
ma-fonction 1,2,3,4 code> (en supposant que le paramètre
$ paramname code> est à la première position). P>
$ args code> est juste un choix malheureux comme
$ args code>
est une variable automatique et ne doit donc pas être utilisée pour un nom de paramètre. Presque tout autre nom (qui n'est pas dans le Variables automatiques liste) devrait faire comme dans l'exemple de Sean M. , mais à la place vous devrait mettre en œuvre votre cmdlet en supposant qu'elle sera appelée à partir du milieu d'un pipeline (voir: Fortement encouragée Directives de développement ).
(et si vous voulez le faire complètement correctement, vous devez donner un nom singulier, les noms de paramètres pluriels ne doivent être utilisés que dans les cas où la valeur du paramètre est toujours em> un élément multiple Valeur.) SUB> P> MOYEN H2>
$ noms = "adam", "BEN", "PORTE" CODE >).
Cela se produit lorsque vous fournissez les noms «$» via un argument: p> $ NAME code> à l'aide de la code> Code> foreach code> cmdlet.) p>
$ code> via le pipeline: p>
$Names | Create-Object
Name Index Batch
---- ----- -----
Adam 1 1
Ben 2 2
Carry 3 3
Je pense que vous pouvez y parvenir en utilisant Méthodes de traitement d'entrée Commencez code>,
processus code> et
extrémité code> blocks. Je viens de courir dans ça. Voici mon résultat de console qui joue simplement avec cela et vous pouvez voir en mettant le corps de la fonction dans le bloc code> (code> ce qui se comporte la façon dont vous vous attendez
ne fonctionne pas h2>
λ ~ function test-pipe {
>> param (
>> # Parameter help description
>> [Parameter(ValueFromPipeline=$true)]
>> [String[]]
>> $Texts
>> )
>> BEGIN {}
>> PROCESS {$Texts | % {Write-Host $_}}
>> END {}
>>
>> }
λ ~ $s | test-pipe
this
that
another
λ ~