PowerShell ForEach / Tuyauterie confusion
Je suis l'aide de la TSF PowerTools Applets de commande PowerShell pour essayer d'obtenir des informations sur les Modifications connexes et des WorkItems à partir de mon serveur. J'ai fait bouillir le problème de comportement que je ne comprends pas et je suis en espérant qu'il n'est pas TFS spécifiques (si quelqu'un là-bas peut-être en mesure d'expliquer le problème pour moi 🙂 )
Voici la seule commande que je puisse vous mettre au travail:
Get-TfsItemHistory C:\myDir -recurse -stopafter 5 | % { Write-Host $_.Les WorkItems[0]["Titre"] }
Il fait ce que j'attends - Get-TfsItemHistory renvoie une liste de 5 ensembles de Modifications, et il les tuyaux de ceux d'un foreach qui affiche le Titre de la première associés WorkItem. Alors, quel est mon problème? Je suis en train d'écrire un grand texte, et je préfère code de choses à regarder de plus comme un programme C# (powershell syntaxe me fait pleurer). Chaque fois que j'essaie de faire les écrits ci-dessus de toute autre manière, les WorkItems collection est null.
Les commandes suivantes (que j'ai interpréter logiquement équivalent) ne fonctionnent pas (Le WorkItems collection est nulle):
$articles = Get-TfsItemHistory C:\myDir -recurse -stopafter 5 $items | ForEach-Object { Write-Host $_.Les WorkItems[0]["Titre"] }
Celui que je préférerais vraiment:
$articles = Get-TfsItemHistory C:\myDir -recurse -stopafter 5 foreach ($item de $articles) { $item.Les WorkItems[0]["Titre"] # faire beaucoup d'autres choses }
J'ai lu un article à propos de la différence entre le 'foreach' l'opérateur et la Cmdlet ForEach-Object, mais qui semble être plus d'une performance débat. Cela semble vraiment être un problème lorsque la tuyauterie est utilisé.
Je ne sais pas pourquoi tous les trois de ces approches ne fonctionnent pas. Toute réflexion est apprécié.
OriginalL'auteur hexate | 2010-10-24
Vous devez vous connecter pour publier un commentaire.
C'est en effet à confusion. Pour l'instant, un travail autour de est de saisir les éléments comme suit:
Ce accède à la WorkItems collection qui semble provoquer cette propriété d'être rempli (je sais - WTF?). J'ai tendance à utiliser
@()
pour générer un tableau dans le cas où je veux utiliser le mot-clé foreach. La chose avec le mot-clé foreach, c'est qu'il va itérer une valeur scalaire $dont la valeur null. Si la si la requête ne retourne rien,$items
est affectée $null et le foreach va effectuer une itération de la boucle une fois avec$item
la valeur null. Maintenant PowerShell traite généralement avec les valeurs null très bien. Toutefois, si vous avez la main que la valeur de retour de la .NET Framework, il n'est généralement pas aussi indulgent. Le@()
sera la garantie d'un tableau avec 0, 1 ou N éléments. Si c'est 0, alors la boucle foreach de ne pas exécuter son corps à tous.BTW votre dernière approche -
foreach ($item in $items) { ... }
- devrait fonctionner parfaitement.OriginalL'auteur Keith Hill