我试图在数组$dailyTasks
上迭代,在EmployeeName
列中查找“空白”,即''
值,并将其他数组中的名称注入到这些空值中。
在for loop
启动之前,数组的外观示例:
| Task | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | | |
| Task2 | Person Y | |
| Task3 | | |
| Task4 | Person Z | Person X |
这是我的for循环代码,它会产生一个不想要的结果。$randomisedUsers
是Object[]
$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循环哪里出了问题,我已经被困在这上面一段时间了…
提亚
发布于 2021-07-18 23:34:56
我个人会用这样的方法:
$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
:
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
中删除项将导致以下结果:
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)
https://stackoverflow.com/questions/68433747
复制相似问题