gpt4 book ai didi

powershell - 在PowerShell中将非唯一值与唯一字段并置

转载 作者:行者123 更新时间:2023-12-03 00:59:04 25 4
gpt4 key购买 nike

我有以下查询集合,它们检索一组数据,将其合并下来,这样我就得到唯一的值,并为每个值添加一个数字(以便以后可以选择该特定项)。

$allMoveRequests = Get-MoveRequest -DomainController server | 
select Alias,Status,TargetDatabase,BatchName

$optNum=1
$AllMoveBatches = @($allMoveRequests | Sort-Object -Property BatchName |
Select-Object BatchName,TargetDatabase -Unique) |
Select @{Name="Option";Expression={$optNum;$optNum++}},BatchName,TargetDatabase

$AllMoveBatches | Format-Table -AutoSize | Out-String|% {Write-Host $_}

返回:
Option BatchName TargetDatabase
------ --------- --------------
1 Batch1 Database1
2 Batch2 Database2

依此类推,但我要添加的是这些批次中的“状态”值,这些值在不止一个的情况下进行合并,而不是创建重复的条目。例如,如果我仅将Status添加到第二行代码中,则最终得到:
Option BatchName TargetDatabase Status
------ --------- -------------- ------
1 Batch1 Database1 Completed
2 Batch1 Database1 In Progress
3 Batch2 Database2 Completed

而我理想的情况是:
Option BatchName TargetDatabase Status
------ --------- -------------- ------
1 Batch1 Database1 Completed,InProgress
2 Batch2 Database2 Completed

我试过在select语句中使用表达式查询所有相关的Status条目并将-Unique应用于它们,但这只会返回所有批次中的所有Status条目,而不仅仅是返回与当前Batch行相关的状态条目。

有没有办法做到这一点?

最佳答案

它不是很漂亮,而且在处理大量数据时可能表现不佳,但这是一种实现方法...

首先,让我们创建一些样本数据:

$data = @(
(new-object PSObject -Property ([ordered] @{
"BatchName" = "Batch1"
"TargetDatabase" = "Database1"
"Status" = "Completed"
})),
(new-object PSObject -Property ([ordered] @{
"BatchName" = "Batch1"
"TargetDatabase" = "Database1"
"Status" = "In Progress"
})),
(new-object PSObject -Property ([ordered] @{
"BatchName" = "Batch2"
"TargetDatabase" = "Database2"
"Status" = "Completed"
}))
)


现在,对其进行处理:

Set-Variable -Name "optNum" -Option AllScope -Value 1
$results = @( $data | group-object BatchName, TargetDatabase ) `
| select-object @{Name="Option";Expression={$optNum; $optNum++}},
@{Name="BatchName";Expression={$_.Group[0].BatchName}},
@{Name="TargetDatabase";Expression={$_.Group[0].TargetDatabase}},
@{Name="Status";Expression={$_.Group.Status -join ", "}} `
| sort-object -Property BatchName

并显示结果:
PS> $results

Option BatchName TargetDatabase Status
------ --------- -------------- ------
1 Batch1 Database1 Completed, In Progress
2 Batch2 Database2 Completed

它的作用是分组以选择BatchName和DatabaseName的唯一组合,然后生成结果,即从每个组的第一个项目中选择BatchName和DatabaseName,并将该组中项目的所有Status属性连接在一起(您可以如果要在每个组中对它们进行排序,过滤或重复数据删除,还可以在状态表达式中处理状态。

请注意,我已将您的原始 sort-object BatchName移动到管道的末尾。毫无意义的排序,比如说1000个对象只能将其中一半扔掉-您最好在最后进行排序。

而且我只能通过使用Set-Variable将其设置为 AllScope来使“选项”计数器起作用,因为当我使用 $optNum++对其进行初始化时, $optNum = 1没有正确地递增变量。

关于powershell - 在PowerShell中将非唯一值与唯一字段并置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58735862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com