PowerShell: коллекция преобразуется в массив, сообщающий длины значений массива вместо значений массива - PullRequest
1 голос
/ 10 октября 2019
$sample = @"
name,path,type
test1, \\server1\path1\test1.txt, 1
test2, \\server1\path1\test2.txt, 1
test3, \\server1\path2\test3.txt, 2
test4, \\server1\path1\test4.txt, 2
test5, \\server1\path3\test1.txt, 3
"@

$s = $sample | ConvertFrom-Csv

$g = $s | Group-Object -Property type
# $g[0].Group.GetType() reports as Collection`1

$t = $g[0].Group | Select -ExpandProperty Path
# $t.GetType() reports as Name=Object[], BaseType=System.Array

$t
# reports:
# \\server1\path1\test1.txt
# \\server1\path1\test2.txt

$t | Select *
# reports:
# Length
# ------
#    25
#    25

Я столкнулся с проблемой в одном из моих сценариев, который мне удалось воспроизвести с помощью предыдущего кода. У меня есть массив из Import-Csv, который включает в себя несколько путей UNC. Я группирую эти пути на основе разных критериев CSV-атрибутов, а затем пытаюсь использовать результирующий объект коллекции .Group, чтобы выполнить больше работы с этой группой. Моя проблема в том, что, если я пытаюсь что-то сделать с этим объектом, кроме как просто передать его на консоль, объект сообщает как значения, а не сами значения.

Например: $ t |Converto-Html -Fragment

Может кто-нибудь объяснить, что происходит, когда длины излучаются в отличие от значений, и, в конечном счете, как это исправить, чтобы получить значения вместо длин с помощью Group-Object, задействованных свойств группы? ТИА

1 Ответ

1 голос
/ 10 октября 2019

Поскольку вы используете -ExpandProperty, $t = $g[0].Group | Select -ExpandProperty Path хранит (массив) простые строковые значения ([string] экземпляров) в $t, а именно значения свойств .path входных объектов.

Select * сообщает о свойствах этих [string] экземпляров (заключенных в [pscustomobject] экземпляров), и учитывая, что строки имеют толькоодно свойство - .Length - вы увидите только эти значения длины, а не строки ' содержимое .

Простой пример (сообщает о длине строки 'one', то есть 3):

PS> 'one' | Select-Object *

Length
------
     3

Обратите внимание, что вы получите аналогичный результат с ConvertTo-Csv / Export-Csv, поскольку они слишком сериализуют свойства ихвходные объекты:

PS> 'one' | ConvertTo-Csv
"Length"
"3"

Если вы опустите переключатель -ExpandProperty, вы получите [pscustomobject] экземпляров со свойством .Path, содержащим интересующие строки пути:

PS> $g[0].Group | Select Path

path
----
\\server1\path1\test1.txt
\\server1\path1\test2.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...