Кроме того, это плохая схема:
$CSV = @();
Get-ChildItem $path1 | ForEach-Object {
$CSV += @(Import-Csv -Delimiter ";" -Path $_)
}
Объединение массивов очень дорого, и его следует избегать, поскольку массивы PowerShell не могут быть расширены.Он должен дублировать весь массив в памяти и добавлять новые данные каждый раз, когда добавляется новое значение.
Попробуйте это:
$CSV = Get-ChildItem $path1 | Import-Csv -Delimiter ";"
$CSV = $CSV | Group-Object -Property Computer |
Select-Object @{Name='Computer';Expression={$_.Name}}, @{Name='Updates_Missing';Expression={ $_.Group | Measure-Object -Minimum -Property Updates_Missing | Select-Object -ExpandProperty Minimum } }
После этого Select-Object использует вычисляемые свойстваопределить минимальное количество отсутствующих обновлений.Вы должны быть осторожны с отсутствующими или пустыми значениями, потому что они, вероятно, будут интерпретироваться как нули.Возможно, вам придется отфильтровать их с помощью чего-то вроде Where-Object { -not [String]::IsNullOrWhiteSpace($_.Updates_Missing) }
Вам также нужно знать о любых нечисловых значениях в столбце Updates_Missing.
Первое вычисленное свойство, @{Name='Computer';Expression={$_.Name}}
, просто переименовывает столбец Name
из вывода Group-Object в Computer
.[Примечание: вы можете просто указать @{n='Computer';e={$_.Name}}
.Я использовал полное имя вычисляемых элементов свойства для ясности.]
Второе вычисляемое свойство - это то, что делает вычисления:
@{Name='Updates_Missing';Expression={ $_.Group | Measure-Object -Minimum -Property Updates_Missing | Select-Object -ExpandProperty Minimum } }
Мы хотим, чтобы имя второго столбца былобыть Updates_Missing
.Выражение более сложное, хотя.Столбец Group
из вывода Group-Object представляет собой коллекцию каждого объекта в группе.
Вот что я вижу с тестовыми данными только с Group-Object:
PS C:\> $CSV | Group-Object -Property Computer
Count Name Group
----- ---- -----
2 Computer_1 {@{Computer=Computer_1; Updates_Missing=12}, @{Computer=Computer_1; Updates_Missing=4}}
2 Computer_2 {@{Computer=Computer_2; Updates_Missing=8}, @{Computer=Computer_2; Updates_Missing=8}}
2 Computer_3 {@{Computer=Computer_3; Updates_Missing=16}, @{Computer=Computer_3; Updates_Missing=16}}
2 Computer_4 {@{Computer=Computer_4; Updates_Missing=7}, @{Computer=Computer_4; Updates_Missing=2}}
1 Computer_7 {@{Computer=Computer_7; Updates_Missing=22}}
Давайтепосмотрите только на первую запись Group
:
PS C:\> ($CSV | Group-Object -Property Computer)[0].Group
Computer Updates_Missing
-------- ---------------
Computer_1 12
Computer_1 4
Это коллекция из двух объектов.Мы можем использовать Measure-Object, чтобы найти минимальное значение:
PS C:\> ($CSV | Group-Object -Property Computer)[0].Group | Measure-Object -Property Updates_Missing -Minimum
Count : 2
Average :
Sum :
Maximum :
Minimum : 4
Property : Updates_Missing
Обратите внимание, что Measure-Object
был достаточно умным, чтобы воспринимать ввод строки, который он получил, как числовое значение.Это может укусить нас потенциально.Например, пропущенные значения могут отображаться как нули в выходных данных.Вы должны принять это во внимание.
Нам нужен только минимум, а не остальная часть этого объекта измерения.Итак:
PS C:\> ($CSV | Group-Object -Property Computer)[0].Group | Measure-Object -Property Updates_Missing -Minimum | Select-Object -ExpandProperty Minimum
4
И вот как вы получите это для своего выражения во втором вычисляемом свойстве:
@{Name='Updates_Missing';Expression={ $_.Group | Measure-Object -Minimum -Property Updates_Missing | Select-Object -ExpandProperty Minimum } }
Если у вас есть несколько столбцов, то все становится немногоболее сложный.
Допустим, теперь ваши столбцы: Computer, IP и Updates_Missing.
Попробуйте что-то вроде:
$CSV | Group-Object -Property Computer |
Select-Object @{Name = 'Computer'; Expression = {$_.Name}},
@{Name = 'IP' ; Expression = { $_.Group | Sort-Object -Property @{Expression = {[int]$_.Updates_Missing}} | Select-Object -ExpandProperty IP -First 1 } },
@{Name = 'Updates_Missing'; Expression = { $_.Group | Sort-Object -Property @{Expression = {[int]$_.Updates_Missing}} | Select-Object -ExpandProperty Updates_Missing -First 1 } }
Я снова изменил логику здесь,Вместо использования Measure-Object, мы будем использовать Sort-Object с вычисляемым свойством в сочетании с Select-Object, чтобы получить только первую запись.Таким образом, когда мы говорим, что Computer_1
имеет 4 Missing_Updates
, то IP-адрес, который мы возвращаем, является IP-адресом той записи, в которой было 4 пропущенных обновления.Вы можете повторить ту же логику для последующих полей, обновляя только имя свойства и свойство, указанное для Select-Object -ExpandProperty
.