7
votes

Script PowerShell échoue après avoir accédé à la propriété Array.Length

Quelqu'un peut-il expliquer pourquoi ce script jette une exception? xxx

Fondamentalement, je crée une gamme de nombres, formatant le tableau, puis vérifiant sa longueur et la formatant à nouveau.

Le premier format réussit, mais le deuxième format jette une exception. xxx


3 commentaires

Devrait-il être sur Serverfault? Peut-être pas parce que c'est le script, mais pas l'administrateur?


Cela ne devrait pas, car il s'agit clairement d'une question sur le comportement étrange d'un programme et non d'abuotement à l'administration de rien.


+1. Ceci est une question fascinante (à moi), et pas du tout admin relation.


3 Réponses :


3
votes

C'est certainement bizarre. En tant que solution de contournement, vous pouvez utiliser

"{0:X}{1:X}{2:X}" -f @($byteArray)


2 commentaires

Merci. C'est le même travail autour que j'ai utilisé. Il semble que vous copiez la matrice à une nouvelle variable, vous pouvez utiliser cette variable pour tous vos appels de formatage et aucune exception ne sera lancée.


D'une manière ou d'une autre, l'accès membre change quelque chose dans le tableau qui déclenche ce comportement avec -f. Peut-être que l'un des Devs PowerShell sait ce qui se passe.



1
votes

wow, c'est assez fascinant. J'ai joué avec cela pendant quelques minutes sur PowerShell V2 et je ne trouve pas une raison difficile et rapide sur la raison pour laquelle cela se passe.

Mais cela ne m'arrêtera pas de spéculer :)

Le problème est que la commande -f attend vraiment une gamme d'objets. Ce qui se passe clairement dans la ligne de problème est que c'est interprétant $ byteArray en tant qu'élément unique contre un tableau.

Mais pourquoi fonctionne-t-il la première fois? Ma suspicion est que le tableau est évalué paresseux. Jusqu'à ce que vous appelez réellement une méthode sur le type de matrice, il s'agit simplement d'un alias dans le pipeline. Par une certaine Fluke, cela fonctionne dans le premier cas car il s'agit simplement d'indexer dans la conduite de tuyaux ou les arguments existants. Une fois que vous appelez .Longueur, il gèle le pipeline dans un objet et d'où les appels ultérieurs l'interprétent correctement comme une matrice.

Encore une fois, il s'agit principalement de spéculations. Je vous conseille vivement de déposer un bogue sur Connect car cela sent un bug.


0 commentaires

4
votes

à ajouter au puzzle:

PS > $a = @(1,2,3)
PS > "{0:X}{1:X}{2:X}" -f $a
123
PS > "{0:X}{1:X}{2:X}" -f $a.PSObject
Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argum
ent list..
At line:1 char:21


0 commentaires