2016-06-30 3 views
3

Я изучаю PowerShell (newbie alert !!) и пытаюсь понять, почему наблюдается следующее странное поведение. (Окружающая среда: Windows 10 с помощью PowerShell 5)массив Powershell, содержащий массив

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 > 

Любые указатели на то, что происходит?

При наборе этого вопроса я пытался проанализировать ситуацию. Способ, которым я это вижу:
$B=($A,4,5,6) делает $ B массив с элементом массива.
$B=($B,7,8,9) делает $ B массив с элементом массива с элементом массива.
Функция CLI PowerShell, которая показывает содержимое переменной, не проходит вплоть до элементов листа, но останавливается на втором уровне.
Следовательно, внутренний массив (содержимое == $ A) показан как некоторый объект.
Это объяснение правильно?

+2

У вас нет копии, это ссылка. вы должны попробовать его с помощью $ A.Clone() – tire0011

+0

@ tire0011, я согласен с тем, что он является ссылкой, но то же самое поведение наблюдается даже при использовании Clone() в моих приведенных выше примерах [Например, '$ B = ($ B. Clone(), 7,8,9) 'все еще показывает тот же результат для $ B] – Prem

+1

Первый вложенный массив сжимается при выводе на консоль,' $ B' на самом деле имеет длину '4', с индексом' 0' весь массив $ A. Итак, да, ваше объяснение правильно –

ответ

1

Причина в том, что PowerSer просто раздувает один уровень. Так что просто посмотрите на следующие результаты, чтобы понять:

$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 

Если вы хотите несколько мерного массива, несмотря несмотря на массив массивов, вы можете использовать:

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

«upvote & thanks»: Новый объект выглядит интересным, но почему CLI «сглаживает» только один уровень? – Prem

0

После дальнейшего анализа (и входы от шины0011 & Mathias R. Jessen & JPBlanc) ситуация становится все яснее.

Есть две части этого вопроса:
(A) Сохраняется ли информация в каком-то странном формате (или даже повреждена)?
(B) Если нет, то почему вывод не показывает числа от 1 до 9?

PS > ConvertTo-Json -InputObject $B 
[ 
    [ 
     [ 
      1, 
      2, 
      3 
     ], 
     4, 
     5, 
     6 
    ], 
    7, 
    8, 
    9 
] 
PS > 

(A) Данные корректно хранятся в формате «массив внутри массива внутри массива» без каких-либо повреждений.
(B) Выход CLI PowerShell показывает контент только на 2 уровня глубиной и показывает объекты для более глубоких уровней. Я не мог найти ссылку на эту претензию, но ближайший я получил: 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. 

Если я получаю ссылку на «Глубину» на выходе CLI, я буду обновлять этот ответ.

Смежные вопросы