Considérez le script Powershell suivant, qui recherche les dossiers dans C: \ avec un «og» dans leur nom:
PS C: \> (ls |% {$ _. Nom} |? {$ _. Contient ("og")}) PerfLogs Fichiers de programme setup.log
Maintenant, je restreins la recherche pour obtenir un seul élément:
PS C: \> (ls |% {$ _. Nom} |? {$ _. Contient ("Prog")}) Fichiers de programme
Ce qui est étrange, c'est que la première opération produit un tableau , tandis que la deuxième opération (qui est à mon humble avis la même opération sémantique, donc elle devrait produire le même type de résultat) renvoie une chaîne . Cela peut être vu dans le résultat suivant:
PS C: \> (ls |% {$ _. Nom} |? {$ _. Contient ("og")}). Longueur 3 PS C: \> (ls |% {$ _. Nom} |? {$ _. Contient ("Prog")}). Longueur 13
Cela peut être très irritant, car apparemment il y a moins de dossiers qui correspondent à 'og' que ceux qui correspondent à 'Prog'.
Évidemment, PowerShell «décompresse» implicitement un tableau à 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 sur le pipeline, je dois vérifier si je » m traitant d'un tableau ou non.
Comment puis-je empêcher que cela se produise? Comment gérez-vous cela?
la source
$_.Contains
, alors ça%{,,$_.Name}
marche ...Réponses:
Et zéro élément se traduit par
$null
.Tu ne peux pas.
Utilisez le constructeur de tableau (
@(...)
) pour forcer une collection (éventuellement avec zéro ou un élément) return:la source
@(1) | ConvertTo-Json
retourne toujours1
au lieu de[1]
.ConvertTo-Json
ne renvoie jamais de collection: il lit la totalité de l'entrée et la convertit en une seule chaîne. Si vous voulez que les objets d'entrée soient convertis individuellement, vous devrez les traiter séparément.Ce problème a été résolu dans PowerShell v3:
http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/03/19/Counting-objects-in-PowerShell-3.0.aspx
Sur une note latérale, vous pouvez trouver si un nom contient quelque chose à l'aide d'un caractère générique:
la source
Notez la différence entre ces deux résultats:
Le fait est que le «déballage» est effectué par l'opération de canalisation. ConvertTo-Json voit toujours l'objet comme un tableau si nous utilisons InputObject plutôt que des tuyaux.
la source