Prenons l'exemple du Powershell script suivant, qui recherche dans C:\ les dossiers dont le nom contient un "og" :
PS C:\\> (ls | %{$\_.Name} | ?{$\_.Contains("og")})
PerfLogs
Program Files
setup.log
Maintenant, je restreins la recherche pour n'obtenir qu'un seul élément :
PS C:\\> (ls | %{$\_.Name} | ?{$\_.Contains("Prog")})
Program Files
Ce qui est étrange, c'est que la première opération donne un réseau alors que la seconde opération (qui est sémantiquement la même opération, et qui devrait donc donner le même type de résultat) donne un chaîne de caractères . Cela se traduit par le résultat suivant :
PS C:\\> (ls | %{$\_.Name} | ?{$\_.Contains("og")}).Length
3
PS C:\\> (ls | %{$\_.Name} | ?{$\_.Contains("Prog")}).Length
13
Cela peut être très irritant, car il y a apparemment moins de dossiers qui correspondent à "og" que de dossiers qui correspondent à "Prog".
Manifestement, PowerShell "décompose" implicitement un tableau d'un seul élément en un seul objet, et nous n'obtenons jamais un tableau de longueur 1. Il semble que chaque fois que je veux compter les résultats qui arrivent dans le pipeline, je dois vérifier si j'ai affaire à un tableau ou non.
Comment éviter que cela ne se produise ? Comment faites-vous face à ce problème ?