7
votes

Comment ai-je un paramètre de tableau qui apporte-t-il des informations à partir des arguments ou du pipeline dans PowerShell?

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 ':'


0 commentaires

4 Réponses :


9
votes

Utilisez la variable automatique $ entrée .

Si seule entrée de pipeline est attendue alors: xxx

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): xxx


0 commentaires

4
votes

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 ':'
  }
}


0 commentaires

1
votes

ValueFromPipeline

Vous devriez utiliser le pipeline (valeurfrommeline) car PowerShell est spécialement conçu pour cela. P>

$ args h2>

Tout d'abord, Il n'y a pas de vraie différence entre:
My-Fonction - 1,2,3,4 code> et
ma-fonction 1,2,3,4 code> (en supposant que le paramètre $ paramname code> est à la première position). P>

Le point est que le point Nom du paramètre $ 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>

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> xxx pré>

Il crée essentiellement des objets personnalisés dans une liste de noms ( $ noms = "adam", "BEN", "PORTE" CODE >).
Cela se produit lorsque vous fournissez les noms «$» via un argument: p> xxx pré>

(il itère via tous les noms dans $ NAME code> à l'aide de la code> Code> foreach code> cmdlet.) p>

et cela se produit lorsque vous fournissez les noms $ code> via le pipeline: p>

$Names | Create-Object

Name  Index Batch
----  ----- -----
Adam      1     1
Ben       2     2
Carry     3     3


0 commentaires

0
votes

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
λ ~


0 commentaires