gpt4 book ai didi

powershell - 在Powershell中切片数组(或列表)的更好方法

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

我如何导出CSV文件中的地址,每个范围为30个用户。
我已经尝试过了

    $users = Get-ADUser -Filter * -Properties Mail 
$nbCsv = [int][Math]::Ceiling($users.Count/30)
For($i=0; $i -le $nbCsv; $i++){
$arr=@()
For($j=(0*$i);$j -le ($i + 30);$j++){
$arr+=$users[$j]
}
$arr|Export-Csv -Path ($PSScriptRoot + "\ASSFAM" + ("{0:d2}" -f ([int]$i)) + ".csv") -Delimiter ";" -Encoding UTF8 -NoTypeInformation
}

它有效,但是,我认为有一种更好的方法可以完成此任务。
你有什么主意吗?

谢谢。

最佳答案

Bacon Bits' helpful answer显示了如何使用..range operator来简化代码,但最好使用通用分块(分区,批处理)机制;但是,从PowerShell 7.0开始,没有内置功能

This GitHub feature suggestion建议在-ReadCount <int>中添加一个Select-Object参数,类似于已经为Get-Content定义的同名参数。
如果您希望实现此功能,请在此处显示对链接问题的支持。

使用该功能后,您可以执行以下操作:

$i = 0
Get-ADUser -Filter * -Properties Mail |
Select-Object -ReadCount 30 | # WISHFUL THINKING: output 30-element arrays
ForEach-Object {
$_ | Export-Csv -Path ($PSScriptRoot + "\ASSFAM" + ("{0:d2}" -f ++$i) + ".csv") -Delimiter ";" -Encoding UTF8 -NoTypeInformation
}

在此期间,您可以使用自定义函数 Select-Chunk(下面的源代码):在上面的代码段中将 Select-Object -ReadCount 30替换为 Select-Chunk -ReadCount 30

这是它如何工作的简单演示:
PS> 1..7 | Select-Chunk -ReadCount 3 | ForEach-Object { "$_" }

1 2 3
4 5 6
7

上面显示 ForEach-Object脚本块收到以下内容
通过 $_依次排列三个数组: 1, 2, 34, 5, 6, 7
(当对数组进行字符串化时,默认情况下会获得以空格分隔的元素列表;例如, "$(1, 2, 3)"产生 1 2 3)。
Select-Chunk源代码:

该实现使用 [System.Collections.Generic.Queue[object]] 实例以固定大小的批次收集输入。
function Select-Chunk {
<#
.SYNOPSIS
Chunks pipeline input.

.DESCRIPTION
Chunks (partitions) pipeline input into arrays of a given size.

By design, each such array is output as a *single* object to the pipeline,
so that the next command in the pipeline can process it as a whole.

That is, for the next command in the pipeline $_ contains an *array* of
(at most) as many elements as specified via -ReadCount.

.PARAMETER InputObject
The pipeline input objects binds to this parameter one by one.
Do not use it directly.

.PARAMETER ReadCount
The desired size of the chunks, i.e., how many input objects to collect
in an array before sending that array to the pipeline.

0 effectively means: collect *all* inputs and output a single array overall.

.EXAMPLE
1..7 | Select-Chunk 3 | ForEach-Object { "$_" }

1 2 3
4 5 6
7

The above shows that the ForEach-Object script block receive the following
three arrays: (1, 2, 3), (4, 5, 6), and (, 7)
#>

[CmdletBinding(PositionalBinding = $false)]
[OutputType([object[]])]
param (
[Parameter(ValueFromPipeline)]
$InputObject
,
[Parameter(Mandatory, Position = 0)]
[ValidateRange(0, [int]::MaxValue)]
[int] $ReadCount
)

begin {
$q = [System.Collections.Generic.Queue[object]]::new($ReadCount)
}

process {
$q.Enqueue($InputObject)
if ($q.Count -eq $ReadCount) {
, $q.ToArray()
$q.Clear()
}
}

end {
if ($q.Count) {
, $q.ToArray()
}
}

}

关于powershell - 在Powershell中切片数组(或列表)的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59259674/

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