Pipe compléter tableau-objets au lieu d'éléments de tableau un à la fois?

Comment faites-vous envoyer la sortie d'une Applet de commande à la prochaine dans un pipeline complet de la matrice de l'objet à la place de l'individu éléments du tableau une par une?

Le problème - description Générique
Comme on peut le voir dans l'aide pour about_pipelines (help pipeline) powershell envoie des objets un à la fois, en bas du pipeline1. Donc Get-Process -Name notepad | Stop-Process envoie un processus à la fois, en bas du tuyau.

Permet de dire que nous avons un 3ème partie Applet de commande (Do-SomeStuff) qui ne peuvent pas être modifiés en aucune façon. Faire-SomeStuff effectuer différentes si il est passé à un tableau de chaînes ou si il est passé à un seul objet de type string.

Faire-SomeStuff est juste un exemple, il pourrait être remplacé pour ForEach-ObjectSelect-ObjectWrite-Host (ou tout autre Applet de commande d'accepter les entrées de pipeline)

Faire-SomeStuff sera dans cet exemple, le processus de l'individu éléments du tableau un à la fois.

$theArray = @("A", "B", "C")
$theArray | Do-SomeStuff

Si nous voulons envoyer à l'ensemble de la gamme, comme un objet pour le Faire-SomeStuff on pourrait essayer quelque chose comme cela

@($theArray) | Do-SomeStuff

Mais elle ne produit pas le résultat attendu depuis PowerShell "ignore" le nouveau single-point-matrice.

Alors, comment avez-vous "force" $theArray à être transmis de la pipe comme un seul tableau-objet plutôt que le contenu et les éléments un à la fois?

Le problème - exemple pratique
Comme indiqué ci-dessous, la sortie de Write-Host est différente en cas d'adoption d'un tableau ou si il a passé les différents éléments dans un tableau à la fois.

PS C:\> $theArray = @("A", "B", "C")
PS C:\> Write-Host $theArray
A B C
PS C:\> $theArray | foreach{Write-Host $_}
A
B
C
PS C:\> @($theArray) | foreach{Write-Host $_}
A
B
C

Comment faites-vous pour obtenir $theArray | foreach{Write-Host $_} pour produire le même résultat que Write-Host $theArray ?


NOTES de bas de page

  1. Pipeline de traitement dans Powershell

Normal d'un tableau de chaînes de caractères

PS C:\> @("A", "B", "C").GetType().FullName
System.Object[]

Normal d'un tableau de chaînes de caractères courante à Foreach-Object

PS C:\> @("A", "B", "C") | foreach{$_.GetType().FullName}
System.String
System.String
System.String

Chaque chaîne dans le tableau est traité à la fois par la CmdLet ForEach-Object.

Un tableau de tableaux, où le "intérieure" tableaux sont des tableaux de chaînes de caractères.

PS C:\> @(@("A", "B", "C"), @("D", "E", "F"), @("G", "H", "I")) | foreach{$_.GetType().FullName}
System.Object[]
System.Object[]
System.Object[]

Chaque tableau dans le tableau est traité à la fois par la CmdLet ForEach-Object, et le contenu de chaque sous-tableau à partir de l'entrée est traitée comme un objet, même si c'est un tableau.

source d'informationauteur NoOneSpecial