首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PowerShell:迭代不按预期工作的多个变量

PowerShell:迭代不按预期工作的多个变量
EN

Stack Overflow用户
提问于 2021-07-18 23:19:33
回答 1查看 47关注 0票数 1

我试图在数组$dailyTasks上迭代,在EmployeeName列中查找“空白”,即''值,并将其他数组中的名称注入到这些空值中。

for loop启动之前,数组的外观示例:

代码语言:javascript
运行
复制
| Task  | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 |              |               |
| Task2 | Person Y     |               |
| Task3 |              |               |
| Task4 | Person Z     | Person X      |

这是我的for循环代码,它会产生一个不想要的结果。$randomisedUsers是Object[]

代码语言:javascript
运行
复制
$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
                    }
                }
            }
    }
}

结果:

代码语言:javascript
运行
复制
| Task  | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | Person A     |               |
| Task2 | Person Y     |               |
| Task3 | Person A     |               |
| Task4 | Person Z     | Person X      |

这里的问题是,$_.Group.EmployeeName包含两个对象,但是不管出于什么原因,结果表没有在数组中填充Person B:

代码语言:javascript
运行
复制
$_.Group.EmployeeName

{Person A, Person B}

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

代码语言:javascript
运行
复制
| Task  | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | Person A     |               |
| Task2 | Person Y     |               |
| Task3 | Person B     |               |
| Task4 | Person Z     | Person X      |

我不完全确定我的for循环哪里出了问题,我已经被困在这上面一段时间了…

提亚

EN

Stack Overflow用户

回答已采纳

发布于 2021-07-18 23:34:56

我个人会用这样的方法:

代码语言:javascript
运行
复制
$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或空白的值,它将用$fillEmployees的索引0替换该值,然后从列表中删除该索引0。

很难判断您试图用代码完成什么,但是如果您有一个类型为System.Array的数组,其中填充了随机名称,用于填充EmployeeName上的空值,则可以将该Array转换为允许您使用.RemoveAt(..)方法的ArrayList

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
PS /> $fillEmployees.RemoveAt(0)
Exception calling "RemoveAt" with "1" argument(s): "Collection was of a fixed size."
At line:1 char:1
...
...

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

代码语言:javascript
运行
复制
PS /> $fillEmployees = [System.Collections.ArrayList]$fillEmployees

PS /> $fillEmployees.RemoveAt(0)
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68433747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档