2016-06-30 9 views
3

Ich lerne PowerShell (Newbie Alarm !!) und versuche herauszufinden, warum das folgende seltsame Verhalten gesehen wird. (Umwelt: Windows 10 mit Powershell 5)Powershell-Array mit Array

C:\>POWERSHELL 
Windows PowerShell 
Copyright (C) 2015 Microsoft Corporation. All rights reserved. 

PS > $A=(1,2,3) # When a variable stores a new array, ... 
PS > $A # the elements are shown correctly. 
1 
2 
3 
PS > $B=$A # When the array is copied, ... 
PS > $B # the elements are shown correctly. 
1 
2 
3 
PS > $B=($A,4,5,6) # When the variable stores a new array with elements from some other array ... 
PS > $B # the elements are shown correctly. 
1 
2 
3 
4 
5 
6 
PS > $B=($B,7,8,9) # But, when the variable stores a new array with elements from the array currently stored in the same variable, ... 
PS > $B # something strange is seen 


Length   : 3 
LongLength  : 3 
Rank   : 1 
SyncRoot  : {1, 2, 3} 
IsReadOnly  : False 
IsFixedSize : True 
IsSynchronized : False 
Count   : 3 

4 
5 
6 
7 
8 
9 


PS > 

Alle Hinweise auf das, was ist hier los?

Während ich diese Frage eintippte, versuchte ich die Situation zu analysieren. Die Art, wie ich es sehe:
$B=($A,4,5,6) macht $ B ein Array mit einem Array-Element.
$B=($B,7,8,9) macht $ B ein Array mit einem Array-Element mit einem Array-Element.
Die PowerShell CLI-Funktion, die den Variableninhalt anzeigt, geht nicht bis zu den Blattelementen, sondern auf der zweiten Ebene.
Daher wird das innerste Array (contents == $ A) als ein Objekt angezeigt.
Ist diese Erklärung korrekt?

+2

Sie haben keine Kopie, es ist eine Referenz. Sie sollten es mit $ A.Clone() – tire0011

+0

@ tire0011 versuchen, ich stimme zu, dass es eine Referenz ist, aber das gleiche Verhalten wird auch bei Verwendung von Clone() in meinen obigen Beispielen gesehen [zB $ B = ($ B. Clone(), 7,8,9) 'zeigt immer noch die gleiche Ausgabe für $ B] – Prem

+1

Das erste verschachtelte Array wird geglättet, wenn es an die Konsole ausgegeben wird,' $ B' hat tatsächlich die Länge '4', wobei der Index' 0' ist das gesamte $ A-Array. Also ja, deine Erklärung richtig –

Antwort

1

Der Grund ist, dass PowerSer Just eine Ebene aufblasen. So haben nur einen Blick auf die folgenden Ergebnisse zu verstehen:

$B[0] -> 1,2,3,4,5,6 
$B[0][0] -> 1,2,3 # Your $A 
$b[0][0][0] -> 1 # Etc ... 
$B[0][1] -> 4 
$B[0][2] -> 5 
$B[1] -> 7 
$B[2] -> 8 
$B[3] -> 9 

Wenn Sie ein Multi-dimensionales Array trotz trotz Array von Arrays möchten, können Sie verwenden:

$arrayAll = New-Object 'int[,]' (3,3) 
$arrayAll[2,0] = 42 
+0

"upvote & thanks": New-Object sieht interessant aus, aber warum "platt" das CLI nur eine Ebene? – Prem

0

Nach weiteren Analyse (und Eingaben von Reifen0011 & Mathias R. Jessen & JPBlanc) wird die Situation klarer.

Es gibt zwei Teile dieser Frage:
(A) Werden die Daten in einem seltsamen Format gespeichert (oder werden sie sogar beschädigt)?
(B) Wenn nicht, warum zeigt der Ausgang die Zahlen von 1 bis 9 nicht an?

(A) Die Daten werden korrekt im Format "array inside array inside array" ohne jegliche Beschädigung gespeichert.
(B) PowerShell CLI-Ausgabe zeigt Inhalte nur 2 Ebenen tief und zeigt Objekte für tiefere Ebenen. Ich konnte keine Referenz für diese Behauptung finden, aber die nächst ich erhielt, war: https://technet.microsoft.com/en-us/library/hh849922.aspx

-Depth<Int32> 
    Specifies how many levels of contained objects are included in the JSON representation. 
    The default value is 2. 

Wenn ich eine Referenz für die „Tiefen“ in der CLI-Ausgabe zu erhalten, werde ich diese Antwort aktualisieren.