58 votes

Pourquoi Powershell convertit-il silencieusement un tableau de chaînes de caractères avec un seul élément en une chaîne de caractères ?

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 ?

1voto

C. Aknesil Points 41

Dans votre cas, vous devez utiliser count plutôt que length .

> (ls | %{$_.Name} | ?{$_.Contains("og")}).count
3
> (ls | %{$_.Name} | ?{$_.Contains("Prog")}).count
1

count retours

  • nombre d'éléments, pour les objets de type tableau,
  • 1, pour les objets scalaires,
  • 0, pour $null .

Remarque : count ne fonctionne pas pour les pscustomobject dans les versions antérieures à PowerShell 6.1, ce qui était un bogue : https://docs.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-arrays?view=powershell-7.1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X