首页 > 解决方案 > PowerShell:迭代多个变量未按预期工作

问题描述

我正在尝试遍历一个数组$dailyTasks以在列中查找“空白”即''值,并将EmployeeName另一个数组中的名称注入到这些空值中。

数组开始前的样子示例for loop

| Task  | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 |              |               |
| Task2 | Person Y     |               |
| Task3 |              |               |
| Task4 | Person Z     | Person X      |

这是我的 for 循环代码,会产生不希望的结果。$randomisedUsers是一个对象[]

$randomisedUsers | Group-Object { $_ -in ($randomisedUsers | Select-Object -Last 2) } | ForEach-Object {
    if ($_.Name -eq 'True') {
            for ($i = 0; $i -lt $dailyTasks.Count; $i++) {
                if ($dailyTasks[$i].Task -eq 'Task4') {
                    $dailyTasks[$i].EmployeeName = $_.Group.EmployeeName[0]
                    $dailyTasks[$i].EmployeeName2 = $_.Group.EmployeeName[1]
                }
            }
    } else {
            for ($i = 0; $i -lt $dailyTasks.Count; $i++) {
                if ($dailyTasks[$i].EmployeeName -eq '') {
                    if ($_.Count -gt '1') {
                        for ($x = 0; $x -lt $_.Group.EmployeeName.Count; $x++) {
                            $dailyTasks[$i].EmployeeName = $_.Group.EmployeeName[$x]
                        }
                    } else {
                        $dailyTasks[$i].EmployeeName = $_.Group.EmployeeName
                    }
                }
            }
    }
}

结果:

| Task  | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | Person A     |               |
| Task2 | Person Y     |               |
| Task3 | Person A     |               |
| Task4 | Person Z     | Person X      |

这里的问题是它$_.Group.EmployeeName包含两个对象,但无论出于何种原因,结果表都没有在数组中填充 Person B:

$_.Group.EmployeeName

{Person A, Person B}

在这种情况下,期望的结果是:

| Task  | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | Person A     |               |
| Task2 | Person Y     |               |
| Task3 | Person B     |               |
| Task4 | Person Z     | Person X      |

我不完全确定我的 for 循环哪里出错了,我已经被困了一段时间......

TIA

标签: powershell

解决方案


我个人会使用这样的东西:

$csv = @'
Task,EmployeeName,EmployeeName2 
Task1,,
Task2,Person Y,
Task3,,
Task4,Person Z,Person X      
'@ | ConvertFrom-Csv

$fillEmployees = [System.Collections.ArrayList]@(
    'Person A'
    'Person B'
)

foreach($line in $csv)
{
    if([string]::IsNullOrWhiteSpace($line.EmployeeName))
    {
        $line.EmployeeName = $fillEmployees[0]
        $fillEmployees.RemoveAt(0)
    }
}

流程非常简单,如果循环在EmployeeName中找到一个值为 null 或有空格的值,它将用索引 0 替换该值,$fillEmployees然后从列表中删除该索引 0。

很难说出您要使用代码完成什么,但是如果您有一个System.Array填充了随机名称的类型的数组,这些名称将用于填充EmployeeName上的空值,您可以将其转换ArrayArrayList允许您使用.RemoveAt(..)方法:

PS /> $fillEmployees = 0..10 | ForEach-Object {"Employee {0}" -f [char](Get-Random -Minimum 65 -Maximum 90)}

PS /> $fillEmployees
Employee J
Employee S
Employee D
Employee P
Employee O
Employee E
Employee M
Employee K
Employee R
Employee F
Employee A

PS /> $fillEmployees.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

尝试从 an 中删除项目Array将导致以下结果:

PS /> $fillEmployees.RemoveAt(0)
Exception calling "RemoveAt" with "1" argument(s): "Collection was of a fixed size."
At line:1 char:1
...
...

但是,如果将其转换为ArrayList(不是转换而是复制它):

PS /> $fillEmployees = [System.Collections.ArrayList]$fillEmployees

PS /> $fillEmployees.RemoveAt(0)

推荐阅读